尝试使用python查找最不常见的倍数,但为什么';我的代码不工作吗?
嗨,我是python的新手。我试图找到最小的正数,它可以被1到20的所有数字平均整除,但我一直得到20,这显然是错误的;我不知道这是为什么尝试使用python查找最不常见的倍数,但为什么';我的代码不工作吗?,python,math,Python,Math,嗨,我是python的新手。我试图找到最小的正数,它可以被1到20的所有数字平均整除,但我一直得到20,这显然是错误的;我不知道这是为什么 def even_divisible(): x=1 for i in range(1,21): if x%i!=0: x+=1 print x even_divisible() 有人知道为什么吗 您的代码存在严重的逻辑缺陷;当for循环结束时(在20个循环之后),打印x的当前值,而不检查其是否可被适当的数字整除。每次递增
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
;awhile
循环,因为我们不知道它将运行多长时间。要最低限度地修复代码,请执行以下操作:
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开始:
def evenly_divisible(n):
x = n
while True: # outer loop over multiples of n
if all(x % i == 0 for i in range(2, n+1)): # inner loop over 2-n
return x
x += n
调试代码并查看它的功能。尝试找到代码循环的点,以测试更高的
x
。它实际上不在那里,这是主要的问题。@JoseMagana我得到了20。相关:Euler#5项目很容易用手或袖珍计算器解决。一旦你解决了这个问题,你就会发现你的程序有什么问题。请记住,欧拉项目的挑战(我确信OP正在这里尝试)是以这样一种方式设计的,暴力方法是一种糟糕的选择。如果你只是在学习Python,它会起作用,但是一旦你熟悉了这种语言,就会有更有效的方法。@TheSoundDefense确实如此,还有更好的实现(翻译成Python留给读者作为练习)。谢谢你的回复。但我的代码似乎可以检查它是否可整除。从x=1开始,如果x在范围(1,20)内不能被i均匀整除,则x=x+1。我认为这个逻辑是正确的,虽然这个方法很慢,但我总是得到20分。你能解释一下原因吗?@ChenxiongYi是的,你不是每次都从1重新开始。将打印i,x
放入for
循环中,看看会发生什么。@jornsharpe你是对的。每次x被1加上,x+1不会被范围(1,21)中的每个数字除,而只会被x不能平均除的数字除。但我不明白为什么。