0

そこで、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

4 に答える 4

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 つの問題を見つけて修正すると、既に修正したバグが再び発生することはありません。単一の例 (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 モジュールを使用してテストを分離することができますが、学習中のコードをすばやく作成するにはやり過ぎです。

于 2013-09-29T09:12:37.410 に答える
0

インデックスは 1 ではなく 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) - 2これは3、再び です。

于 2013-09-29T08:02:21.117 に答える