打印给定数字范围内的素数

时间:2016-11-27 05:31:46

标签: python-3.x range primes control-flow

我试图将所有素数打印到一系列给定数字(低和最大,包括给定数字)。

例如:

  

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号也不是素数。

2 个答案:

答案 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那样抽象代码来避免错误。