问题是:找出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;
}
答案 0 :(得分:8)
您正确计算质数,但总和太大(超过2 ^ 32)并且不适合无符号的32位长。您可以使用64位数字(在某些编译器上long long
)来解决此问题。
答案 1 :(得分:1)
您的逻辑似乎是正确的,但您正在弄乱数据类型及其范围。检查这是否有效:
#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
答案 2 :(得分:0)
您可能还会发现需要使用编译器开关 -std = c99 。我做了 gcc(GCC)3.4.5(mingw-vista special r3)。
即。
gcc -Wall -std = c99 -o problem10 problem10.c