假设我们有一个给定的整数N;我们必须找到所有小于N的Truncatable素数之和。众所周知,truncatable素数是一个可左截数素数的数字(如果前导“ left”数字被连续删除,那么所有结果数都将被视为素数)以及可右截断的质数(如果最后一个“正确”的数字被连续删除,则所有得到的数字将被视为质数)。可截断素数的示例是9137,因为它是左截素素,因为9137、137、37和7是素数。因此9137是可截短的素数。
因此,如果输入类似于N = 55,则输出将为130,因为(2 + 3 + 5 + 7 + 23 + 37 + 53)=
为了解决这个问题,我们将遵循以下步骤-
N:= 1000005
素数:=大小为N的列表,并用True填充
定义一个功能sieve()
。这将需要
prime [1]:= False,prime [0]:= False
对于2到N范围内的i
对于范围为i * 2至N的j,在每一步中更新i,
prime [j]:= False
如果prime [i]与True相同,则
从主要方法中,执行以下操作-
和:= 0
对于2到n范围内的i
当前:= i
f:=真
当电流不为零时,
f:=错误
从循环中出来
如果prime [current]为False,则
当前:=当前/ 10
当前:= i
幂:= 10
(电流/幂)的商不为零时
f:=错误
从循环中出来
如果prime [current mod power]为False,则
幂:=幂* 10
如果f为True,则
和:=和+ i
返还金额
让我们看下面的实现以更好地理解-
N = 1000005 prime = [True for i in range(N)] def sieve(): prime[1] = False prime[0] = False for i in range(2, N): if (prime[i]==True): for j in range(i * 2, N, i): prime[j] = False def get_total_of_trunc_primes(n): sum = 0 for i in range(2, n): current = i f = True while (current): if (prime[current] == False): f = False break current //= 10 current = i power = 10 while (current // power): if (prime[current % power] == False): f = False break power *= 10 if f: sum += i return sum n = 55 sieve() print(get_total_of_trunc_primes(n))
55
输出结果
130