在我的代码中找到逻辑错误以获得前 50 个素数

Finding the logical error in my code to get first 50 primes

我正在尝试编写自己的公式来查找素数,但它并不完全有效,而且我找不到逻辑中的缺陷。请记住,我环顾四周,但找不到与我相似的算法。

我的代码:

#Challenge 7

prime = []

num = 0

found = False

while found == False:


    if num == 0 or num == 1:
        num+=1

    else:

        for value in range(2, num+1):

            if len(prime) == 50:
                print('Found all')
                found = True
                break

            if num % value == 0:
                num+=1

            else:
                if num not in prime:
                    prime.append(num)
                else:
                    pass


print(prime)

此代码适用于前几个素数(3、5、7...) 但它也给出了不正确的值,如 10,我不明白为什么。如果有人能给我解释一下,让我明白逻辑错误在哪里,我将不胜感激。

如果你在num == 10时设置断点,你会清楚地看到问题。

当您开始在 for value in range(2, num + 1): 内部进行除法检查时,第二个数字是 3,因此 num (10) modulo value (3) 是 1,这是您确定质数的测试。你的测试 should 是它不能被小于它的 any 数整除(实际上少于一半就足够了,因为你无论如何都要检查 2 ) .

所以,考虑一下:

    else:
        is_indivisible = True
        # loop through all numbers less than it not including itself
        # (because x % x == 0)
        for value in range(2, num - 1):
            # it is only indivisible if it was previously indivisible
            # And the check is same as before, modulo != 0
            is_indivisible = is_indivisible and (num % value != 0)
            if not is_indivisible:
                break

        # if it is indivisible and it doesn't exist in prime list yet
        if is_indivisible and num not in prime:
            prime.append(num)

        # move on to the next number
        num += 1

错误来自这部分

if num % value == 0:
    num+=1

else:
    if num not in prime:
        prime.append(num)
    else:
        pass

一旦我们找到非约数的第一次出现,您就假设整数是素数。但是素数的定义是区间 [2..prime] 中的 每个 整数都是非约数。我们如何检查任何数字是否没有任何除数?

def isPrime(x):
    for v in range(2, x):
        if (x % v == 0):
            return False;

    return True;

像这样的东西可以用来检查任何给定的数字是否是素数。由于我们现在已经将 isPrime 部分从主循环中取出,我们不再需要在 while 中使用 for 循环。像这样就可以了

def isPrime(x):
    for v in range(2, x):
        if (x % v == 0):
            return False;

    return True;

prime = [}
num = 2 
found = False

while found == False:

    if len(prime) == 50:
        print("found all")
        found = True
        break

    if(isPrime(num)):
        print(num)
        prime.append(num)
        num+=1

    else:
        num+=1