私は今日、休憩時間に忙しくするために Project Euler の問題に取り組み始めました。問題の 1 つは、200 万未満のすべての素数の合計を求めているため、エラトステネスのふるいを一緒に投げて、それらすべての数を見つけました。
unsigned long i, j, sum = 0, limit = 2000000;
// Allocate an array to store the state of numbers (1 is prime, 0 is not).
int* primes = malloc(limit * sizeof(int));
// Initialize every number as prime.
for (i = 0; i < limit; i++)
primes[i] = 1;
// Use the sieve to check off values that are not prime.
for (i = 2; i*i < limit; i++)
if (primes[i] != 0)
for (j = 2; i*j < limit; j++)
primes[i*j] = 0;
// Get the sum of all numbers still marked prime.
for (i = 2; i < limit; i++)
if (primes[i] != 0)
sum += i;
printf("%d", sum);
limit
これは、約50万まで完全に機能します。この後、ランダムな値が返されます (たとえば、1000000 は -1104303641 を返します)。unsigned long
すべての変数をunsigned long long
無駄に宣言しようとしました。primes[]
その時点で 1 と 0 しか含まれていないため、エラーは最後の 4 行で発生しているようです。これは、処理されている値のサイズと関係があると思いますが、誰かガイダンスを提供できますか?