我今天开始研究 Project Euler 问题,让自己忙于休息。其中一个问题要求所有质数的总和低于 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
大约一百万。此后,它返回随机值(例如,1000000 返回 -1104303641)。我尝试将所有unsigned long
变量声明为unsigned long long
无济于事。错误似乎发生在最后 4 行,因为primes[]
此时只包含 1 和 0。我认为这与正在使用的值的大小有关,任何人都可以提供任何指导吗?