题
问题是:在下面找到2000000所有素数的总和
我非常确实的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;
}
解决方案
您正确计算的素数,但总和过大(超过2 ^ 32),并且将不适合在一个无符号的32位长。可以使用一个64位的数(在一些编译器long long
)解决此问题。
其他提示
您的逻辑似乎是正确的,但你的数据类型搞乱他们ranges.Check是否该作品与否:
#include <stdio.h>
#define LIMIT 2000000
int i[LIMIT];
int main()
{
long long int n = 0, k, sum = 0;
for(n = 0; n < LIMIT; n++)
i[n] = 1;
i[0] = 0;
i[1] = 0;
long long int p = 2;
while (p*p < LIMIT)
{
k = 2;
while (p*k <LIMIT)
{
i[p*k] = 0;
k++;
}
p++;
}
for(n = 0; n < LIMIT; n++)
if (i[n] == 1)
{
sum += n;
}
printf("%lld\n",sum);
return 0;
}
Output :142913828922
您也可能会发现,你需要使用编译器开关的 -std = C99 为好。我与的 GCC(GCC)3.4.5(mingw的-远景特殊R3)强>
即。
GCC -Wall -std = C99 -o problem10 problem10.c
不隶属于 StackOverflow