python查找数字位置_python – 查找数字的算法

写一个递归算法,列举显性素数.你的算法应该在找到它们时打印显性素数(而不是在最后).默认情况下,我们将我们要寻找的主要素数限制为最大值10 ^ 12,预期的运行时间应该在或小于一分钟.

以下是我的python代码,它不能按预期工作:

import math

def test_prime(n):

k = 2

maxk = int(math.sqrt(n))

while k <= maxk:

if n % k == 0:

return False

if k == 2:

k += 1

else:

k += 2

return (n is not 1)

def dominant_prime_finder(maxprime=10**12,n=1):

l = 1 #length of the current number

while n // 10 > 0:

l += 1

n //= 10

if test_prime(n) == True:

is_dominant_prime = True

index_smaller = n

while l > 1 and index_smaller > 9:

index_smaller //= 10

if test_prime(index_smaller) == False:

is_dominant_prime = False

break

for i in range(1,10):

if test_prime(i*10**l + n) == True:

is_dominant_prime = False

break

if is_dominant_prime == True:

print(n)

while n <= maxprime:

dominant_prime_finder()

解决方法:

您可以在不枚举10 ^ 12下的所有数字的情况下解决问题,这通过对数字的长度进行递归是低效的.

它的工作方式如下:

>长度1的素数是:2,3,5,7.

>对于所有这些数字,检查第三个条件,对于任何数字dn1∈{1,…,9},dn 1dn … d0不是素数.对于2,没关系.对于3它失败(例如13).将您找到的所有素数存储在列表L中.对长度为1的所有素数执行此操作.

>在L中,你现在拥有长度为2的所有素数,其中一个素数作为第一个数字,因此你拥有长度为2的主要素数的所有候选者

递归地执行此操作会在python中获得所有主要素数:

def test_prime(n):

k = 2

maxk = int(math.sqrt(n))

while k <= maxk:

if n % k == 0:

return False

if k == 2:

k += 1

else:

k += 2

return (n is not 1)

def check_add_digit(number,length):

res = []

for i in range(1,10):

if test_prime( i*10**(length) + number ):

res.append(i*10**(length) + number)

return res

def one_step(list_prime,length):

## Under 10^12

if length > 12:

return None

for prime in list_prime:

res = check_add_digit(prime,length)

if len(res) == 0:

#We have a dominant prime stop

print(prime)

else:

#We do not have a dominant prime but a list of candidates for length +1

one_step(res,length+1)

one_step([2,3,5,7], length=1)

这在我的机器上工作不到一分钟.

标签:python,algorithm,data-structures,recursion,primes

来源: https://codeday.me/bug/20190527/1161822.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值