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

时间:2018-06-17 14:43:36

标签: python-3.x 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,我不明白为什么。如果有人可以向我解释,以便我能理解逻辑错误在哪里,我会很感激。

2 个答案:

答案 0 :(得分:2)

错误来自这部分

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

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

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

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

    return True;

这样的事情可以检查任何给定的数字是否是素数。而且由于我们现在已将isPrime部分从主循环中取出,因此我们不再需要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

答案 1 :(得分:1)

如果您为fun generateWeek(): Week{ val format = SimpleDateFormat("MMM d", Locale.ENGLISH) val mondayTime = getMondayTime() val sundayTime = getSundayTime() val label = "${format.format(mondayTime)} - ${format.format(sundayTime)}" return Week(label, mondayTime, sundayTime) } 设置断点,您将清楚地看到问题。

当您开始对num == 10内部进行除法检查时,第二个数字为3,因此num(10)模数值(3)为1,这是您确定素数的测试。你的测试 应该是什么,它不会被任何数字整除,而不是它(因为你用2检查,实际上不到一半)。

所以,请考虑一下:

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