为什么我会失败Project Euler#10?

ida*_*ika 11 c sieve-of-eratosthenes

问题是:找出200万以下所有素数的总和.

我几乎完成了Erastothenes筛选的事情,下面的程序似乎适用于少数,即定义LIMIT,因为10L产生17作为答案.

我提交了1179908154作为答案,由以下程序生成,这是不正确的.

请帮助指出问题所在.谢谢.

#include <stdio.h>

#define LIMIT 2000000L
int i[LIMIT];

int main()
{
    unsigned long int n = 0, k, sum = 0L;
    for(n = 0; n < LIMIT; n++)
        i[n] = 1;
    i[0] = 0;
    i[1] = 0;

    unsigned long int p = 2L;

    while (p*p < LIMIT)
    {
        k = 2L;
        while (p*k < LIMIT)
        {
            i[p*k] = 0;
            k++;
        }
        p++;
    }

    for(n = 0; n < LIMIT; n++)
        if (i[n] == 1)
        {
            sum += n;
        }
    printf("%lu\n",sum);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

int*_*jay 8

您可以正确计算素数,但总和太大(超过2 ^ 32)并且不适合无符号的32位长.您可以使用64位数字(long long在某些编译器上)来解决此问题.