C 当输入太大时,算法返回垃圾?
我今天开始处理Euler项目的问题,让自己忙着休息。其中一个问题是所有素数的总和都在200万以下,所以我收集了一个埃拉托斯提尼筛来找出所有这些数C 当输入太大时,算法返回垃圾?,c,algorithm,primes,C,Algorithm,Primes,我今天开始处理Euler项目的问题,让自己忙着休息。其中一个问题是所有素数的总和都在200万以下,所以我收集了一个埃拉托斯提尼筛来找出所有这些数 unsigned long i, j, sum = 0, limit = 2000000; // Allocate an array to store the state of numbers (1 is prime, 0 is not). int* primes = malloc(limit * sizeof(int)); // Initiali
unsigned long i, j, sum = 0, limit = 2000000;
// Allocate an array to store the state of numbers (1 is prime, 0 is not).
int* primes = malloc(limit * sizeof(int));
// Initialize every number as prime.
for (i = 0; i < limit; i++)
primes[i] = 1;
// Use the sieve to check off values that are not prime.
for (i = 2; i*i < limit; i++)
if (primes[i] != 0)
for (j = 2; i*j < limit; j++)
primes[i*j] = 0;
// Get the sum of all numbers still marked prime.
for (i = 2; i < limit; i++)
if (primes[i] != 0)
sum += i;
printf("%d", sum);
无符号长i,j,和=0,极限=2000000;
//分配一个数组来存储数字的状态(1是素数,0不是)。
int*primes=malloc(limit*sizeof(int));
//将每个数字初始化为素数。
对于(i=0;i
这可以完美地工作到大约50万的
极限。在此之后,它返回随机值(例如,1000000返回-1104303641)。我尝试将所有无符号long
变量声明为无符号long
,但没有效果。错误似乎发生在最后4行中,因为primes[]
在该点只包含1和0。我认为这与正在处理的值的大小有关,有人能提供一些指导吗?Wolfram Alpha告诉我,素数的总和小于500000是一个很好的例子
这个数字不适合32位整数,所以在求和循环中溢出了一个int。您可以尝试使用uint64\u t
,但如果限制足够高,最终会再次出现该问题(尽管我怀疑2000000的限制会合适)。将%d更改为%ld,您应该得到:
142913828922
这似乎是(接近或)正确的答案
…假设您的long不是32位
如果您在32位平台上,您将需要某种第三方大int库
建议:@totymedli:你真的建议OP在堆栈上分配一个200万long的数组吗?你的平台上long的大小是多少?printf(“%d\n”,sizeof(long));您尝试过其他格式的字符串吗?%l而不是%d?或者可能是未签名长时间的%ul?我刚刚运行了这个,它在我的mac上看起来不错。更改ld末尾的printf,我得到:142913828922——这与daniel fischer所说的素数之和whatint
,数组的索引一致?如何将其更改为uint64\t
?不,不需要更改数组的索引。只有总数,但这已经是一个很长的时间了。看起来,除非你有一个专业帐户,否则你无法运行2000000的查询。超过标准计算时间…将%d更改为%ld或%ul将产生11790908154,这确实更接近正确答案。