我试图将所有素数打印到一系列给定数字(低和最大,包括给定数字)。
例如:
num1 = 10,num2 = 20
>>> 11, 13, 17, 19
我的代码在某些情况下失败了,我无法理解原因:
num1 = int(input('First number is: '))
num2 = int(input('Second number is: '))
if num2 <= num1:
num1,num2 = num2,num1
for i in range(num1, num2+1):
for p in range(2,int(num2**0.5)+1):
if i%p == 0:
break
else:
print(i,' ',end = '')
print('\n')
结果:
1至7&gt;&gt;&gt; 1 3 5 7(省略2)
1至30&gt;&gt;&gt; 1 7 11 13 17 19 23 29(省略2,3,5)
1至60&gt;&gt;&gt; 1 7 11 13 17 19 23 29(省略2,3,5,7)
0到0&gt;&gt;&gt; 0(打印0 - >不是素数)
0到7&gt;&gt;&gt; 1 3 5 7(省略2)
我该如何纠正?非常感谢!
PS。 1号也不是素数。
答案 0 :(得分:2)
代码中的错误是内部for循环范围的第二部分没有i
而不是num2
num1 = int(input('First number is: '))
num2 = int(input('Second number is: '))
if num2 > num1:
num1, num2 = num2, num1
for i in range(num1, num2+1):
if i == 0 or i == 1: continue
for p in range(2,int(i**0.5)+1): # the second part should be int(i**0.5) + 1, not int(num2**0.5)+1
if i%p == 0:
break
else:
print(i,' ',end = '')
而不是为num1&lt; num2和另一种方式,你可以做类似下面的事情。进一步在代码设计方面,最好将其稍微分解为is_prime
方法。这样,如果您想编写一个更快速的素性测试器,您可以轻松编辑辅助函数,而不是弄乱主代码。
def is_prime(num):
if i == 1: return False
for p in range(2,int(num**0.5)+1):
if num % p == 0:
return False
return True
inp1 = int(input('First number is: '))
inp2 = int(input('Second number is: '))
num1 = min(inp1, inp2)
num2 = max(inp1, inp2)
for i in range(num1, num2+1):
if is_prime(i):
print(i,' ',end = '')
print('\n')
答案 1 :(得分:1)
您没有考虑数字本身的数字划分。 即当范围是1到30,sqrt(30)+1 = 5 + 1 = 6时,所有低于6的nn都有一个案例,它们被数字本身除以2%2,3%3 ... i%i
解决方法是将内部for循环的范围更改为:
for i in range(num1, num2+1):
for p in range(2,int(i**0.5)+1): #Change num2 to i to avoid i%i
if i%p == 0:
break
else:
print(i,' ',end = '')
最好像gowrath那样抽象代码来避免错误。