以下程序是使用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;
}
答案 0 :(得分:7)
您需要将sum定义为64位整数
long long sum=0;
否则它是32位整数且数字溢出。
以十六进制:
hex(142913828922) = 0x214653f83a
hex(1179908154) = 0x4653f83a