質問: 先程質問したエラトステネスのふるいについて。 とりあえず、0から100までの素数のリストをすべて挙げることプログラムを実装することには成功しましたが、その個数をうまく出力するプログラムがわかりません。 なので、`printf("0から100までの素数の合計は%d個です。\n",a);` という文を添えたのですが、コンパイル後に実行したところ、素数のリストが全て消えて、なおかつ、素数の合計を表示する文章も期待しているのとはかなり違って表示されました。 私は、以下のようにプログラムをしました。 ``` #include #include #define NUMBER 100 int main() { int prime[NUMBER+1]; int i,j,lim; for(i=2;i<=NUMBER;i++){ prime[i]=1; } lim=(int)sqrt(NUMBER); for(i=2;i<=lim;i++){ if(prime[i]==1){ for(j=2*i;j<=NUMBER;j++){ if(j%i==0){ prime[j]=0; } } } } int a=0; for(i=2;i<=NUMBER;i++){ if(prime[i]==1){ printf("%d ",i); a++; if(a%10==0){ printf("\n"); } printf("0から100までの素数の合計は%d個です。\n",a); } } } ``` 実行結果 ``` $ ./a.out 2 0から100までの素数の合計は1個です。 3 0から100までの素数の合計は2個です。 5 0から100までの素数の合計は3個です。 7 0から100までの素数の合計は4個です。 11 0から100までの素数の合計は5個です。 13 0から100までの素数の合計は6個です。 17 0から100までの素数の合計は7個です。 19 0から100までの素数の合計は8個です。 23 0から100までの素数の合計は9個です。 29 0から100までの素数の合計は10個です。 31 0から100までの素数の合計は11個です。 37 0から100までの素数の合計は12個です。 41 0から100までの素数の合計は13個です。 43 0から100までの素数の合計は14個です。 47 0から100までの素数の合計は15個です。 53 0から100までの素数の合計は16個です。 59 0から100までの素数の合計は17個です。 61 0から100までの素数の合計は18個です。 67 0から100までの素数の合計は19個です。 71 0から100までの素数の合計は20個です。 73 0から100までの素数の合計は21個です。 79 0から100までの素数の合計は22個です。 83 0から100までの素数の合計は23個です。 89 0から100までの素数の合計は24個です。 97 0から100までの素数の合計は25個です。 ``` 期待している実行結果 ``` 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 0から100までの素数の合計は25個です。 ``` 自分は、`printf("0から100までの素数の合計は%d個です。\n",a);` を挿入するべき位置や、その文章が間違っているのだと思いますが、上記のような期待した実行結果にするためにはどうすればよいのでしょうか。
回答: どこでどのように出力をしているのか、頭の中で実行の流れを追いながら考えてみてください。 今回、出力をしている部分は以下のあたりです。 ``` int a=0; for(i=2;i<=NUMBER;i++){ if(prime[i]==1){ printf("%d ",i); a++; if(a%10==0){ printf("\n"); } printf("0から100までの素数の合計は%d個です。\n",a); } } ``` この部分の `printf` の部分で出力をしています。`for` によってどの部分が何回繰り返されるのかを考えながら、それぞれの `printf` が何回実行されるのかを数えてください。 特に、`for` の中にある `printf("0から100までの素数の合計は%d個です。\n",a);` は何回も実行されます。しかし本来は素数の数を数えた後、最後に 1 回だけ実行されて欲しいのではないでしょうか?