0

私はプロジェクトオイラーを試していましたが、これに固執しています:

回文数は、両方の方法で同じように読み取られます。2つの2桁の数字の積から作られた最大の回文は9009=9199です。

2つの3桁の数字の積から作られた最大の回文を見つけます。

for i in range(1000,100,-1):
    for j in range(1000,100,-1):
        test = i*j
        test = str(test)                #turn product into string
        test2 = test[2:]                #take last two numbers
        test2 = test2[::-1]             #flip them
        if test[:2] == test2:           #if it's a palindrome, the first two should 
            print(i, "\t", j)           #match the flip of last two

input("\n\nPress the ENTER key to exit.")

実行しても何も起こりません。コマンドラインは計算しますが、何も出力しません。しかし、プログラムは終了します。

大きい数字には最初と最後の2つの数字だけではないことはわかっていますが、それらを確認するのに十分な数の回文があるはずです。

これが次のものです:

合計が1000であるピタゴラストリプレットを見つけます。a^2+ b ^ 2 = c ^ 2、a + b + c = 1000

for a in range(1,32):
    for b in range(1,32):
        c = (a**2 + b**2)**.5
        if a + b + c == 1000:
            print(a,"\t",b,"\t",c)
input("\n\nPress the ENTER key to exit.")

最後のプログラムと同様に、出力はありません...しかし、繰り返しになりますが、出力は終了します。しかし、両方ともforループがネストされていることに気づきました。これはそれと関係がありますか?

4

3 に答える 3

2

両方のテストが間違っています。最初の例では、行

test2 = test[2:]                #take last two numbers

コメントの内容は示されていません。この行では、文字列から最初の2文字が削除され、最後の桁のみが残ります。この行を修正する代わりに、文字列全体が逆の文字列と等しいかどうかを確認するだけです。

if test == test[::-1]:

2番目の例では、近似浮動小数点数を正確な整数と比較します1000。浮動小数点数には丸め誤差があるため、完全に一致するものは見つかりません。Pythonチュートリアルの浮動小数点演算:問題と制限も参照してください。

c最も近い整数に丸め、純粋な整数演算を使用してそれらが本当にピタゴラストリプルであるかどうかを確認してから、合計が1000であるかどうかをテストする必要があります。

コメントでDSMが指摘しているように、ループも早期に停止します。これらの値で見つかる最大の合計は約106です。

于 2012-07-18T14:48:29.037 に答える
0

2番目の問題:単純な間違い; cは浮動小数点数であり、a + b + cを1000と比較しています;浮動小数点数に上げると、浮動小数点数が得られます(例:(3 ** 2 + 4 ** 2)*)。 * 0.5 == 5.0

于 2012-07-18T14:52:07.630 に答える
0

2番目の問題では、十分な範囲がありません。aとbの最大値が31の場合、cの最大値は(31 ^ 2 + 31 ^ 2)^ 0.5になる可能性があるため、a + b + cの合計は(2 + sqrt(2 )* 31、これは1000未満です。

浮動小数点の問題については、必ずint()関数を使用してcを整数に変換してください。これにより、丸め誤差との重複が生じる可能性があります(その解決策を試したときは、私にとってはそうではなかったと思います)が、手動で行ったとしても、正しい結果を得るために得られるいくつかの結果を確認するのは簡単です。 1分以内。

于 2012-07-18T15:07:03.807 に答える