Eratosthenes的筛子代码用C表示

时间:2014-01-13 17:33:56

标签: c algorithm

以下程序是使用The Eveosthenes算法计算所有小于200万的素数的总和。总和应该等于142913828922,而它将来1179908154.此代码中的错误是什么?

#include<stdio.h>

#include<stdlib.h>

#define LIMIT 2000000

int main()
{
    unsigned long long int i,j;
    int *primes;
    int z=1,sum;

    primes = (int*)malloc(sizeof(int)*LIMIT);

    for(i=2;i<LIMIT;i++)
        primes[i]=1;

    for(i=2;i<LIMIT;i++)
        if(primes[i])
            for(j=i;i*j<LIMIT;j++)
                primes[i*j]=0;

    for(i=2;i<LIMIT;i++)
        if(primes[i])
            sum+=i;

    printf("total = %ld",sum);
    return 0;
}

1 个答案:

答案 0 :(得分:7)

您需要将sum定义为64位整数

long long sum=0;

否则它是32位整数且数字溢出。

以十六进制:

hex(142913828922) = 0x214653f83a
hex(1179908154)   =   0x4653f83a