问题是您需要在输入数字后找到素数,或者如果数字输入为素数,则返回该数字。它工作正常。输入为def brute_prime(n):
for i in range(2, int(n**(0.5))):
if n % i == 0:
n += 1
else:
return n
时,它无法正常工作。它返回1001而不是1009.完整的代码是:
required init
答案 0 :(得分:0)
当您发现号码不是素数并转到下一个号码时,您不会重新启动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
递增后重新启动。
答案 1 :(得分:0)
正如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 :(得分:0)
记住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
答案 3 :(得分:0)
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
检查该点前的每个奇数。
isPrime
试用版适用于小数字,但如果您希望将其用于较大的数字,我建议使用Miller-Rabin test (deterministic version)或Baille-PSW test。你可以在这里找到米勒测试的两个版本的python实现:http://rosettacode.org/wiki/Miller%E2%80%93Rabin_primality_test#Python