在 Python 中查找小于 N 的所有可截断素数之和
假设我们有一个给定的整数 N;我们必须找到小于 N 的所有可截断素数之和。众所周知,可截断素数是一个既是左可截断素数(如果连续删除最左边的数字,则所有生成的数字都被视为素数)又是右可截断素数(如果连续删除最右边的数字,则所有生成的数字都被视为素数)的数字。可截断素数的一个例子是 9137,因为 9137、137、37 和 7 都是素数。因此,9137 是一个可截断素数。
因此,如果输入类似于 N = 55,则输出将为 130,因为 (2 + 3 + 5 + 7 + 23 + 37 + 53) =
为了解决这个问题,我们将遵循以下步骤:
N := 1000005
prime := 一个大小为 N 的列表,并填充为 True
定义一个函数 sieve()。这将采用
prime[1] := False, prime[0] := False
对于 i 从 2 到 N,执行:
如果 prime[i] 等于 True,则
对于 j 从 i * 2 到 N,每次递增 i,执行:
prime[j] := False
从主方法中,执行以下操作:
sum := 0
对于 i 从 2 到 n,执行:
current := i
f := True
当 current 不为零时,执行:
如果 prime[current] 为 False,则
f := False
退出循环
current := current / 10
current := i
power := 10
当 (current / power) 的商不为零时,执行:
如果 prime[current mod power] 为 False,则
f := False
退出循环
power := power * 10
如果 f 为 True,则
sum := sum + i
返回 sum
示例
让我们看看下面的实现,以便更好地理解:
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