「for」を使用するとコードが明確になる可能性があることは理解していますが、このコードが機能しない理由を理解したいと思います。また、このコードは 2008 MIT OCW クラスの演習用に改造したものであり、使用が許可されている関数は算術関数、if、elif、else、print、および while のみです。指摘しておくと、コードは最初の 1000 個の素数を出力するはずでした。
print '2, ' #Print the prime 2 to set only odd primes.
primesofar=3 #Set 3 as the first prime
primecounter=1 #Mark 3 as the first prime to test until 1000, otherwise the while below should test to 1001
primesupport=1 #Create primesupport with a integer value
while primecounter<1000:
primesupport=primesofar/2 #Create a support counter for test the prime. This counter only had to have the half value of the supposed prime, because we only need to try to divide by the primes that are lower than the half of the suppposed prime. In fact it would be better to test for values that are lower than the square root of the supposed prime, but we can't use square root operation yet.
while primesupport>0:
if primesofar%primesupport == 0:
primesupport=-1 #If the remainer of the division is 0, the number isn't prime because it will have more than two divisors so we set primesupport as -1 to exit the while and increase the current primesofar to the next odd number.
primesofar=primesofar+2
elif primesupport==1: #If primesupport is 1, we tested all the numbers below the half of the supposed prime which means the number is prime. So we print it, set the while exit and increase the number of primes counted and go to the next odd number.
print primesofar+', '
primesofar=primesofar+2
primesupport=-1
primecounter=primecounter+1
else:
primesupport=primesupport-1
迅速な対応に感謝しており、コードに目に見えないブレークがあった可能性があると思います。このため、どこで間違いを犯しているかを指摘しやすくするために、コードが本来すべきことを書き留めようと思います。始めましょう: primesofar は 3 を受け取ります。primecounter は 1 を受け取り、primesupport は 1 を受け取ります。最初の while テストは、primecounter で、primesupport が 1000 未満であるため、ループに入ります。次に、3/2=1 であるため、primesupport の値は 1 に変更されます。primesupport は 0 より大きいため、2 番目の while ループに入ります。if 条件が true (3%1=0) であるため、コードは if に入り、primesupport を -1 に変更し、primesofar を 2 増やします (現在は primesupport=-1 および primesofar=5)。 3を印刷せずに、続けましょう。2 番目の while に戻ると、-1 は 0 より大きくないため、False を受け取ります。これにより、コードは最初の while をテストし、primecounter が変更されていないため、再びループに入ります。Primesupport は 2 を受け取ります (5/2=2 のため)。これは 2 番目のループに入り、else 条件までそのすべてを通過します。Primesupport は 1 つ減少し (primesupport now =1)、while ループは引き続き elif に入ります。これにより、5 increase primesofar to 7 reduce primesupport が出力され、while ループが終了し、primecounter が増加し、最初のループに戻って再び開始します。私は、期待どおりに印刷されていない 3 以外に、どこで間違いを犯しているのかわかりません。ご指摘いただければ幸いです。これにより、コードが最初にテストされ、primecounter が変更されていないため、再びループに入ります。Primesupport は 2 を受け取ります (5/2=2 のため)。これは 2 番目のループに入り、else 条件までそのすべてを通過します。Primesupport は 1 つ減少し (primesupport now =1)、while ループは引き続き elif に入ります。これにより、5 increase primesofar to 7 reduce primesupport が出力され、while ループが終了し、primecounter が増加し、最初のループに戻って再び開始します。私は、期待どおりに印刷されていない 3 以外に、どこで間違いを犯しているのかわかりません。ご指摘いただければ幸いです。これにより、コードが最初にテストされ、primecounter が変更されていないため、再びループに入ります。Primesupport は 2 を受け取ります (5/2=2 のため)。これは 2 番目のループに入り、else 条件までそのすべてを通過します。Primesupport は 1 つ減少し (primesupport now =1)、while ループは引き続き elif に入ります。これにより、5 increase primesofar to 7 reduce primesupport が出力され、while ループが終了し、primecounter が増加し、最初のループに戻って再び開始します。私は、期待どおりに印刷されていない 3 以外に、どこで間違いを犯しているのかわかりません。ご指摘いただければ幸いです。Primesupport は 2 を受け取ります (5/2=2 のため)。これは 2 番目のループに入り、else 条件までそのすべてを通過します。Primesupport は 1 つ減少し (primesupport now =1)、while ループは引き続き elif に入ります。これにより、5 increase primesofar to 7 reduce primesupport が出力され、while ループが終了し、primecounter が増加し、最初のループに戻って再び開始します。私は、期待どおりに印刷されていない 3 以外に、どこで間違いを犯しているのかわかりません。ご指摘いただければ幸いです。Primesupport は 2 を受け取ります (5/2=2 のため)。これは 2 番目のループに入り、else 条件までそのすべてを通過します。Primesupport は 1 つ減少し (primesupport now =1)、while ループは引き続き elif に入ります。これにより、5 increase primesofar to 7 reduce primesupport が出力され、while ループが終了し、primecounter が増加し、最初のループに戻って再び開始します。私は、期待どおりに印刷されていない 3 以外に、どこで間違いを犯しているのかわかりません。ご指摘いただければ幸いです。最初のループに戻り、再び開始します。私は、期待どおりに印刷されていない 3 以外に、どこで間違いを犯しているのかわかりません。ご指摘いただければ幸いです。最初のループに戻り、再び開始します。私は、期待どおりに印刷されていない 3 以外に、どこで間違いを犯しているのかわかりません。ご指摘いただければ幸いです。
エラーを指摘し、デバッグ方法を示してくれた FallenAngel、John Machin、DiamRem、Karl Knechtel に感謝します。