c - 输入太大时算法返回垃圾?

标签 c algorithm primes

我今天开始研究 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 大约 50 万。此后,它返回随机值(例如,1000000 返回 -1104303641)。我已经尝试将所有 unsigned long 变量声明为 unsigned long long 但无济于事。错误似乎发生在最后 4 行,因为 primes[] 在那一点只包含 1 和 0。我认为这与正在处理的值的大小有关,任何人都可以提供任何指导吗?

最佳答案

Wolfram Alpha 告诉我小于 500000 的素数之和是 9914236195 .

该数字不适合 32 位整数,因此您在求和循环期间溢出了一个 int。您可以尝试使用 uint64_t,但如果限制足够高,该问题最终会再次出现(尽管我怀疑 2000000 的限制会合适)。

关于c - 输入太大时算法返回垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13813395/

相关文章:

c++ - sleep/nanosleep 是否通过使用繁忙的等待方案来工作?

arrays - 排名和不排名结合约束

algorithm - 这可以用线扫描算法解决吗?

Python:列表理解中某处出错了?

javascript - JavaScript 中的素数

对扑克手牌进行分类 [同花顺失败]

c - 什么内核代码被破坏了?

algorithm - 数组中给定数字的最小窗口

python - 在 python 中生成素数 : how is my logic wrong

c - 进入 DGEEV 参数编号 9 时有非法值