Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用python查找最不常见的倍数,但为什么';我的代码不工作吗?_Python_Math - Fatal编程技术网

尝试使用python查找最不常见的倍数,但为什么';我的代码不工作吗?

尝试使用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的当前值,而不检查其是否可被适当的数字整除。每次递增

嗨,我是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
的当前值,而不检查其是否可被适当的数字整除。每次递增
x
时,不会从1重新启动
for
循环

您需要运行一个外部循环,直到找到合适的
x
;a
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开始:

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不能平均除的数字除。但我不明白为什么。