2014-08-28 31 views
-1

嗨,我是一个python的新手。我试图找到可以从1到20的所有数字均匀分配的最小正数,但是我一直在得到20,这显然是错误的;我不知道那是为什么。尝试使用python来查找最小公倍数,但为什么我的代码不工作?

def even_divisible(): 
    x=1 
    for i in range(1,21): 
    if x%i!=0: 
     x+=1 
    print x 
even_divisible() 

有人知道为什么吗?

+1

调试你的代码,看看会发生什么。 – simonzack 2014-08-28 15:57:03

+0

试着找出代码循环测试'x'的更高值的点。它实际上并不存在,这是主要问题。 – TheSoundDefense 2014-08-28 16:00:24

+0

@JoseMagana我得到了20. – 2014-08-28 16:18:08

回答

0

你的代码有一个重大的逻辑缺陷;当for循环结束时(20循环后),将打印x的当前值,而不检查其是否可被适当的数字整除。每次增加x时,都不要从1重新启动for循环。

您需要一个外部循环才能运行,直到找到合适的x;一个while循环,因为我们不知道它将运行多久。最低限度地解决您的代码:

def even_divisible(): 
    x=1 
    while True: # outer loop 
     for i in range(1,21): # inner loop 
      if x % i != 0: 
       x+=1 
       break # break for loop 
     else: # for loop ran to end without break 
      break # break while loop 
    print x 

您可以anyall为内环简化。还有一些数学简化,因为我们知道,x % 20 == 0,我们只需要看看20的倍数,因为所有整数是1整数倍我们可以从2开始:

+0

请记住,项目欧拉挑战(我确定OP在这里尝试)的设计方式使得暴力方法是一种糟糕的方法选择。如果你只是学习Python,它会起作用,但是一旦你用语言表达了方法,就会有更高效的方法。 – TheSoundDefense 2014-08-28 16:16:44

+0

@TheSoundDefense这是真的,并有更好的实现[在其他地方](http://stackoverflow.com/a/8416789/3001761)(Python的翻译留给读者的练习)。 – jonrsharpe 2014-08-28 16:19:12

+0

感谢您的回复。但看起来我的代码可以检查它是否可以整除。从x = 1开始,如果x不能被范围(1,20)中的i均匀分割,则x = x + 1。我认为这个逻辑是正确的,虽然这个方法很慢,但我总是得到20。你能解释为什么吗? – 2014-08-28 16:21:56

相关问题