質問: end-start; printf("計算時間:%lu\n",elapsed); return 0; } ``` c言語 ```
回答: 素数を入れておく配列`primenumber`は100個しかありませんが、1000000の平方根1000までの素数の数は168個です。つまり、7桁の数字の時に必要になる素数の数に対して、`primenumber`の配列の大きさがたりず、その範囲を超えたところにアクセスしてしまいます。配列の範囲外アクセスは未定義な動作のため、場合によってはおかしな値にで無限ループしたり、セグメンテーション違反で落ちたります。 対応したい数の最大値に合わせて必要な配列の大きさ(最大の素数の数)を計算し直してください。取りあえずチェックだけするなら、`assert()`を使うと便利です。 ``` ... if (j == a) { assert(number < MAX); primenumber[number] = j; number++; } else if (j % a == 0) ... ``` `NDEBUG`マクロの有無で有効無効が切り替わるので、チェック用と速度計測の本番用でコードを書き換える必要が無くなります。