嗨,我是一个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()
有人知道为什么吗?
嗨,我是一个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()
有人知道为什么吗?
你的代码有一个重大的逻辑缺陷;当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
您可以any
或all
为内环简化。还有一些数学简化,因为我们知道,x % 20 == 0
,我们只需要看看20的倍数,因为所有整数是1整数倍我们可以从2开始:
请记住,项目欧拉挑战(我确定OP在这里尝试)的设计方式使得暴力方法是一种糟糕的方法选择。如果你只是学习Python,它会起作用,但是一旦你用语言表达了方法,就会有更高效的方法。 – TheSoundDefense 2014-08-28 16:16:44
@TheSoundDefense这是真的,并有更好的实现[在其他地方](http://stackoverflow.com/a/8416789/3001761)(Python的翻译留给读者的练习)。 – jonrsharpe 2014-08-28 16:19:12
感谢您的回复。但看起来我的代码可以检查它是否可以整除。从x = 1开始,如果x不能被范围(1,20)中的i均匀分割,则x = x + 1。我认为这个逻辑是正确的,虽然这个方法很慢,但我总是得到20。你能解释为什么吗? – 2014-08-28 16:21:56
调试你的代码,看看会发生什么。 – simonzack 2014-08-28 15:57:03
试着找出代码循环测试'x'的更高值的点。它实际上并不存在,这是主要问题。 – TheSoundDefense 2014-08-28 16:00:24
@JoseMagana我得到了20. – 2014-08-28 16:18:08