2016-11-27 56 views
0

我试图将所有素数打印到给定数字范围内(低和最大,包含给定数字)。打印给定数字范围内的素数

例如:

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 >>> 1 3 5 7(省略2)

1〜30 >>> 1 7 11 13 17 19 23 29(省略了2,3,5)

1至60 >>> 1 7 11 13 17 19 23 29(2,3,5,7省略)

0至0 0 >>>(打印0 - >不是素数)

0至7 >>> 1 3 5 7(省略2)

怎么可以我纠正了这个?谢谢一堆!

ps。数字1也不是素数。

+1

如果num2

+0

@MarkTolonen,我一直在寻找这个。感谢提示,我编辑了这个问题。 –

回答

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 < 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') 
+0

您的一些“更正”不正确。 'for' /'else'不是不正确的。这在Python中是一个有效的构造。如果“for”完成,则执行'else',这意味着该数字是主数字。只要发现数字不是素数,中断就会停止“for”...没有理由设置prime = False并继续检查。 –

+0

@MarkTolonen这是疯狂的。我不知道。谢谢,我会编辑答案。很明显,我一直在做太多的C++ – gowrath

+0

FYI,''while' /'else'也是有效的。 –

1

您没有考虑数字除以数字本身的因素。 即当范围为1至30,sqrt(30)+1 = 5 + 1 = 6时,所有小于6的数字都被一个数字除以2%2,3%3 ... 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进行,以避免错误的代码。