找到5,4,3,2,1的最小公倍数

时间:2013-09-29 07:57:49

标签: python

所以,我写了一个小程序来找到5,4,3,2,1的最小公倍数:

num = 1
multiples_list = []

for divisor in range(1,6):
    multiples_list.append(divisor)

multiple_5 = 5 * num
index = len(multiples_list) - 2

while index > 0:
    if multiple_5 % multiples_list[index] == 0:
        index -= 1
    else:
        num += 1
        index = len(multiples_list) - 2

if index == 0:
    print(multiple_5)

似乎我创造了一个无限循环......但为什么呢?

4 个答案:

答案 0 :(得分:2)

我想通了......行

multiple_5 = 5 * num

应该在while循环中,而不是在它之外。因为它在while循环之外,所以当num递增时它永远不会更新。

答案 1 :(得分:1)

好的,让我们逐步完成循环,一次一个循环,看看发生了什么。

循环1:

索引是3,所以multiples_list [index]将是4

multiple_5是5,所以multiple_5%multiples_list [index]将是1

1不等于零,因此num将递增1,index将设置为3

循环2:

索引是3,所以multiples_list [index]将是4

multiple_5是5,所以multiple_5%multiples_list [index]将是1

1不等于零,因此num将递增1并且index设置为3

循环3:

索引是3,所以multiples_list [index]将是4

multiple_5是5,所以multiple_5%multiples_list [index]将是1

1不等于零,因此num将递增1并且index设置为3

所以你看,没有一个循环正在做任何不同的事情,只是稳步增加num的值,你没有在循环中测试,因此循环继续广告。无穷。

答案 2 :(得分:1)

我认为你的算法是:考虑最大数的倍数(这里是5)。当此倍数是所有数字的倍数时停止。

以下是您编写代码的方法。

def lcm(*args):
    maxv = max(args)
    n = maxv
    while any(n % x for x in args):
        n += maxv
    return n

print lcm(1, 2, 3, 4, 5)

调试代码的一种非常有用的方法是在开始编码之前编写测试。这使您可以确保您的代码在各种情况下都能正常工作,并且当您查看并修复一个问题时,您不会重新引入已修复的错误。我觉得你一直在针对单个例子(1,2,3,4,5)调试你的代码,结果你有点过于专注于它的具体细节。

这是我为检查上述代码而编写的实际测试代码:

cases = [
    ((1, 2), 2),
    ((2, 3), 6),
    ((2, 4), 4),
    ((2, 3, 4), 12)
]
for xs, want in cases:
    if want != lcm(*xs): print('lcm(%s) = %s, want %s' % (xs, lcm(*xs), want))

注意,您不需要任何花哨的东西,只需要知道答案的一堆示例,然后运行它们,看看您的代码是否产生了您期望的相同答案。如果有任何差异,只需打印到控制台即可。随着您变得越来越复杂,您可以使用unittest模块,并将测试分开,但是当您学习它时,快速编写代码会过度。

答案 3 :(得分:0)

我认为你忘了索引从零开始而不是一个。

while index > 0。开始时,index将为3,因为它是5 - 2

multiple_5 % multiples_list[index] == 0:将为False,因为5 % 4 == 1。索引从零开始,因此multiples_list[3]4

然后num再增加1,index再次成为len(multiples_list) - 23