在Python中找到N以下所有可截断的素数之和

假设我们有一个给定的整数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
    猜你喜欢