我只是想知道为什么我的代码没有给出正确的答案。 我已经用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);
}
答案 0 :(得分:2)
2000000以下所有素数之和为142913828922(~1.4 * 10 ^ 11)。
适合32位int
的最大数量是2147483647 = 2 ^ 31-1(~2.1 * 10 ^ 9)。
所以你得到一个整数溢出。
unsigned long long sum = 0;
和
printf("The sum is: %lld\n", sum);
应该给出预期的结果。
2也是一个素数,但你不算数。
快速破解是用{2}初始化sum
。
答案 1 :(得分:0)
2也是素数。因此,您可以初始化select user,host,password from mysql.user
(根据@sergej)。
在
sum = 2
您应该使用if (number % i == 0)
{
counter++;
break;
}
来减少额外的迭代次数,因为break
是if (number % i == 0)
,然后计数器值会增加,它将为1并且也非常有效。
您应该使用true
因为200万,unsigned long long int sum = 0
比sum
(2^31-1
更高。
并按if you use int