同じくらい、私は解決策があまりにも複雑であると信じています。最初に、より単純な正方形が行う場合、sqrt()
を計算する必要はありません(つまり、方程式の両辺を正方形にします).2番目のテストの順番が逆になります。なぜprime > sqrt
の後にif number % prime == 0
をチェックしますか? prime > sqrt
の場合、もう1つのテストは必要ありません。そしてそのブール値は何ですか?この問題への私の単純なアプローチ:
primes = [2]
for number in range(3, 2000000 + 1, 2): # only test odd numbers
for prime in primes:
if prime * prime > number: # we're past sqrt, a prime!
primes.append(number)
break
if number % prime == 0: # a composite
break
print(sum(primes))
重複して計算prime * prime
は非効率です。この数値の範囲では何の違いもありませんが、必要に応じて別々の四角形の配列を保持し、素数を列挙し、生成されたインデックスを使用して四角形にアクセスします。素数だけを二分することは、すべての数を平方根にするよりも安いです。
primes = [2]
squares = [4]
for number in range(3, 2000000 + 1, 2):
for index, prime in enumerate(primes):
if squares[index] > number:
primes.append(number)
squares.append(number * number)
break
if number % prime == 0:
break
print(sum(primes))
時間を無駄にしないようにスペースを浪費しています。しかし、再びこの数字の範囲では、それは価値がありません。
@ Jacobr365これは間違っています。ブレークは 'number + = 1'という行に行きますので、whileループの次の繰り返しでif文は' if 3%2 == 0'となりelseが実行されます。しかし、y値は決して変化しません。 –
@DonatPantsありがとうございます。それが私が電話から編集するために得るものです。その行に気付かなかった。コメントを削除する。 – Jacobr365
あなたのプログラムは終了しますが、十分な時間を与えていないので、if(primes [-1])> = 2000000: 'if(primes [-1])> = 200:'プログラムは終了しました。あなたのプログラムをより効率的にすることができます。 –