我编写了一个简单的程序,用于计算,然后将素数加到某个值以下(本例中为1000000)。我测试了它的低范围,看起来很好,所以我对算法很有信心。但是,当我为大数字运行代码时,它会产生错误的数字(有时是负数)。
我是否正确猜测我没有使用正确的数据类型来存储大数字? 如果是这样,有人可以指出我正确的方向吗?我尝试了一些没有成功的事情。感谢
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#define NUM 1000000
int main()
{
long int listNum[NUM];
long int n,x;
long int sum =0;
//Initialize the array
for (n = 1; n <=NUM; n++) {
listNum[n] = n;
}
//Iterate Sieve of Eratosthenes
for (x = 2; x <= sqrt(NUM); x++) { //only currently works for square numbers NUM
for (n = 2; n <=NUM; n++) {
if (listNum[n] % x == 0 && n!=x) {
listNum[n] = 0;
}
}
}
for (n = 2; n <= NUM; n++){
sum += listNum[n];
}
printf("Sum is %d \n", sum);
}
答案 0 :(得分:2)
你的代码中有一个简单的错误:最终printf中的“%d”应为“%ld”。
您使用的是哪种编译器? GCC给了我这个警告:
sieve.c:30:5:警告:格式'%d'需要'int'类型的参数,但是 参数2的类型为'long int'[-Wformat =]
然后它还取决于您平台上的长整数的大小。我的系统上的长整数恰好是64位,但在其他系统上它们只能是32位,然后你的程序就会出现溢出。
答案 1 :(得分:1)