1

コード:

total = 0

for number in xrange(10000):
    divisors = 0
    divisors2 = 0

    for dividend in xrange(1, number/2):
        if number % dividend == 0:
            divisors = divisors + dividend

    for dividend2 in xrange(1, divisors/2):
        if divisors % dividend2 == 0:
            divisors2 = divisors2 + dividend2

    if number == divisors2:
        total = total + number + divisors

print total 

このコードは、10,000未満の友愛数(つまり、それ自体よりも小さい除数の総数が元の数に等しい別の数に等しい数、Project Euler、問題21を参照)を生成し、それらを見つけたときにそれらを追加することになっています。48を生成していますが、これは低すぎます。

プログラムは予想よりもはるかに速く実行されました。私は多くの数値を実行していますが、これは適切な除数を取得するための非常に高速な方法ではないことを知っているので、何かが起きているのではないかと思いました。ループ。Pythonが予期せず停止していたか、ループが順不同で実行されていました。次のループの開始前に除数を印刷するコマンドを入力すると、それは永久に続き、同じ数の長い行を印刷する傾向があります。ここでは間違いなく奇妙なことが起こっています。私は「奇妙なループの振る舞い」をグーグルで検索し、ここで検索しましたが、役に立ちませんでした。[こちら]もチェックしました。2

何が起こっているのですか、それについてどうすればよいですか?

前もって感謝します。

4

3 に答える 3

3

ここでいくつかの問題:

そのはず

total = total + number

また、range(1、x)はx-1までしか実行されません。したがって、range(1、n / 2 + 1)を指定する必要があります

于 2012-10-26T22:17:11.763 に答える
2
xrange(1, n)

からの番号を提供します1 ... n-1。から数値を取得するには1 ... n、を実行する必要がありますxrange(1, n+1)。コードでこの間違いを2回犯します。

a != bまた、元の問題の状態をチェックしていません。

于 2012-10-26T21:59:23.317 に答える
1

あなたのアルゴリズムは壊れています。例で与えられた友愛数284を取り、それをコードで実行してみましょう。

number = 284
divisors = divisors2 = 0

for dividend in range(1, number/2): #goes through all the numbers (1, 2, ..., 141)
    if not number % dividend: divisors += dividend 

#divisors = 78

for dividend2 in range(1, divisors/2): #goes through all the numbers (1, 2, ..., 38)
    if not divisors % dividend2: divisors2 += dividend2

#divisors2 = 51

if number == divisors2:
    #number != divisors2, because 284 != 51
    #the amicable number never gets added to your sum
于 2012-10-26T22:35:00.817 に答える