寻找素数

时间:2016-04-14 20:15:05

标签: python math

问题是您需要在输入数字后找到素数,或者如果数字输入为素数,则返回该数字。它工作正常。输入为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

4 个答案:

答案 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