C中的大数字

时间:2014-06-19 04:14:39

标签: c primes largenumber

我编写了一个简单的程序,用于计算,然后将素数加到某个值以下(本例中为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);
}

2 个答案:

答案 0 :(得分:2)

你的代码中有一个简单的错误:最终printf中的“%d”应为“%ld”。

您使用的是哪种编译器? GCC给了我这个警告:

  

sieve.c:30:5:警告:格式'%d'需要'int'类型的参数,但是   参数2的类型为'long int'[-Wformat =]

然后它还取决于您平台上的长整数的大小。我的系统上的长整数恰好是64位,但在其他系统上它们只能是32位,然后你的程序就会出现溢出。

答案 1 :(得分:1)

标准C仅提供固定宽度的整数类型。如果你使用unsigned个,它们会在某个时刻回转。如果你使用签名的,他们会在某些时候做任何他们想做的事(是的,真的)。您可能需要考虑GMP库。我不太了解它,但它是GHC用于整数的。

修改

正如其他人所提到的,你现在应该对long感到满意;如果你最终处理更大的事情,你可以切换到像GMP这样的更高级的数字实现。