打印给定数字范围内的质数
Print prime numbers in a range of given numbers
我正在尝试将所有素数打印到给定数字范围内(最小和最大,包括给定数字)。
例如:
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 to 7 >>> 1 3 5 7 (omits 2)
1 to 30 >>> 1 7 11 13 17 19 23 29 (omits 2,3,5)
1 to 60 >>> 1 7 11 13 17 19 23 29 (omits 2,3,5,7)
0 to 0 >>> 0 (prints 0 -> not a prime number)
0 to 7 >>> 1 3 5 7 (omits 2)
我该如何纠正这个问题?非常感谢!
ps。数字 1 也不是质数。
您的代码中的错误是内部 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 < 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 到 30 时,sqrt(30)+1 = 5+1 = 6,所有小于 6 的数字都被数字本身除以 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做的那样对代码进行抽象,以免出错。
我正在尝试将所有素数打印到给定数字范围内(最小和最大,包括给定数字)。
例如:
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 to 7 >>> 1 3 5 7 (omits 2)
1 to 30 >>> 1 7 11 13 17 19 23 29 (omits 2,3,5)
1 to 60 >>> 1 7 11 13 17 19 23 29 (omits 2,3,5,7)
0 to 0 >>> 0 (prints 0 -> not a prime number)
0 to 7 >>> 1 3 5 7 (omits 2)
我该如何纠正这个问题?非常感谢!
ps。数字 1 也不是质数。
您的代码中的错误是内部 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 < 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 到 30 时,sqrt(30)+1 = 5+1 = 6,所有小于 6 的数字都被数字本身除以 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做的那样对代码进行抽象,以免出错。