[英]Finding a prime number
问题是您需要在输入数字后找到素数,或者如果输入的是素数,则返回该素数。 工作正常。 当输入为print(brute_prime(1000))
时,它只是不起作用。 它返回1001而不是1009。完整的代码是这样的:
def brute_prime(n):
for i in range(2, int(n**(0.5))):
if n % i == 0:
n += 1
else:
return n
当发现一个数字不是素数并转到下一个数字时,您不会重新启动for i
循环。 这有两个问题:您不检查下一个数字是否是您先前检查的任何因子的倍数,也没有使用新的将范围的结尾增加到int(n ** 0.5)
n
值。
def brute_prime(n):
while true:
prime = true
for i in range(2, int(n ** 0.5)+1):
if n % i == 0:
prime = false
break
if prime:
return n
n += 1
break
将退出for
循环, while true:
将在n
增加之后重新启动它。
正如Barmar建议的那样,每次增加n时,您都需要重新启动循环。 您的范围也比其应有的更早结束,因为范围恰好在第二个参数之前停止。
def brute_prime(n):
while True:
for i in range(2, int(n**(0.5)) + 1):
if n % i == 0:
break
else:
return n
n = n+1
记住2是质数。 再次,您可以将其除以2,然后跳过所有偶数除法
def brute_prime(n):
while True:
if n==2:return n
elif n%2 ==0 or any(n % i==0 for i in range(3, int(n**(0.5)+1),2)):
n += 1
else:
return n
就像克里斯·马丁(Chris Martin)提到的那样,明智的解决方案是分别定义isPrime
函数,并使用它来获取所需的数字。
例如这样
def isPrime(n):
#put here your favorite primality test
from itertools import count
def nextPrime(n):
if isPrime(n):
return n
n += 1 if n%2==0 else 2
for x in count(n,2):
if isPrime(x):
return x
如果给定数字不是素数,则n += 1 if n%2==0 else 2
移至下一个奇数,并使用count
检查从该点开始的每个奇数。
for isPrime
试用版适用于少量数字,但如果您想使用更大的数字,我建议使用Miller-Rabin测试(确定性版本)或Baille-PSW测试 。 您可以在此处找到这两个版本的Miller测试的python实现: http : //rosettacode.org/wiki/Miller%E2%80%93Rabin_primality_test#Python
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.