在我的代码中找到逻辑错误以获得前 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
我正在尝试编写自己的公式来查找素数,但它并不完全有效,而且我找不到逻辑中的缺陷。请记住,我环顾四周,但找不到与我相似的算法。
我的代码:
#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