找出200万以下所有素数的总和

时间:2015-09-05 18:55:05

标签: c

我只是想知道为什么我的代码没有给出正确的答案。 我已经用Euler 7尝试了它,它运行正常。

这是我的代码:

int main(void)
{
    int prime = 1;
    int number = 3;
    int counter = 0;
    int sum = 0;

    while (number <= 2000000)
    {
        counter = 0;
        for (int i = 2; i < (sqrt(number) + 1); i++)
        {
            if (number % i == 0)
            {
                counter++;
            }
        }
        if (counter == 0)
        {
            printf("Number: %d Prime: %d\n", number, prime);
            prime++;
            sum = sum + number;
        }
        number++;
    }
    printf("The sum is: %d\n", sum);
    system("PAUSE");
    return (0);
}

2 个答案:

答案 0 :(得分:2)

第1期

2000000以下所有素数之和为142913828922(~1.4 * 10 ^ 11)。

适合32位int的最大数量是2147483647 = 2 ^ 31-1(~2.1 * 10 ^ 9)。

所以你得到一个整数溢出。

修复1

unsigned long long sum = 0;

printf("The sum is: %lld\n", sum);

应该给出预期的结果。

第2期

2也是一个素数,但你不算数。

修复2

快速破解是用{2}初始化sum

答案 1 :(得分:0)

2也是素数。因此,您可以初始化select user,host,password from mysql.user(根据@sergej)。

sum = 2

您应该使用if (number % i == 0) { counter++; break; } 来减少额外的迭代次数,因为breakif (number % i == 0),然后计数器值会增加,它将为1并且也非常有效。

您应该使用true因为200万,unsigned long long int sum = 0sum2^31-1更高。

并按if you use int

显示总和值