元のコード
#100までの数を、一時保存できる変数(NaturalNumber)を用意する NaturalNumber = [] #100までの素数を、一時保存できる変数(PrimeNumber)を用意する PrimeNumber = [] #反復処理の回数を、一時保存できる変数(Counter)を用意する Counter = 0 #変数(Counter)に1を代入する Counter = 1 #変数(Counter)が100になるまで、以下の処理を繰り返す while Counter <= 100: #変数(NaturalNumber)に、変数(Counter)の値を代入する NaturalNumber.append(Counter) #変数(Counter)の値に1を足す #変数(Counter)に変数(Counter)の値を代入する Counter = Counter + 1 #反復処理の回数を、一時保存できる変数(Counter2)を用意する Counter2 = 0 #変数(Counter)に1を代入する Counter = 0 #変数(Counter)が100になるまで、以下の処理を繰り返す while Counter < 100: #変数(Counter2)に2を代入する Counter2 = 2 #変数(Counter2)が(NaturalNumber@Counter)未満の間、以下の処理を繰り返す while Counter2 < NaturalNumber[Counter]: #変数(NaturalNumber@Counter)を変数(Counter2)で割った余りを出す #余りが0なら if NaturalNumber[Counter] % Counter2 == 0 : #breakする break #余りが0以外なら else : #変数(Counter2)の値に1を足す #変数(Counter2)に変数(Counter2)の値を代入する Counter2 = Counter2 + 1 #breakしなかったら else : #変数(PrimeNumber)に代入する PrimeNumber.append(NaturalNumber[Counter]) #変数(Counter)の値に1を足す #変数(Counter)に変数(Counter)の値を代入する Counter = Counter + 1 #変数(PrimeNumber)を表示する print (PrimeNumber)
改善後のソース
#100までの素数を、一時保存できる変数(PrimeNumber)を用意する PrimeNumber = [] #反復処理の回数を、一時保存できる変数(Counter2)を用意する Counter2 = 0 #変数(Counter)に2を代入する Counter = 2 #変数(Counter)が100になるまで、以下の処理を繰り返す while Counter < 100: #変数(Counter2)に2を代入する Counter2 = 2 #変数(Counter2)が(Counter)未満の間、以下の処理を繰り返す while Counter2 < Counter: #変数(Counter)を変数(Counter2)で割った余りを出す #余りが0なら if Counter % Counter2 == 0 : #breakする break #余りが0以外なら else : #変数(Counter2)の値に1を足す #変数(Counter2)に変数(Counter2)の値を代入する Counter2 = Counter2 + 1 #breakしなかったら else : #変数(PrimeNumber)に代入する PrimeNumber.append(Counter) #変数(Counter)の値に1を足す #変数(Counter)に変数(Counter)の値を代入する Counter = Counter + 1 #変数(PrimeNumber)を表示する print (PrimeNumber)
実行結果
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
そもそも、1~100までの整数をいったん保管しておくこと自体が無駄な作業ですね。なので、NaturalNumberを無くしました。
このように無駄なコードは無駄な変数に直結していることはわかります。NaturalNumberを無くせば良いという発想で見ていくと、無駄な処理が見えてきます。そうすると、簡略化した形で書けるようになってきます。