Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当输入太大时,算法返回垃圾?_C_Algorithm_Primes - Fatal编程技术网

C 当输入太大时,算法返回垃圾?

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

我今天开始处理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));

// 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所说的素数之和
what
int
,数组的索引一致?如何将其更改为
uint64\t
?不,不需要更改数组的索引。只有总数,但这已经是一个很长的时间了。看起来,除非你有一个专业帐户,否则你无法运行2000000的查询。超过标准计算时间…将%d更改为%ld或%ul将产生11790908154,这确实更接近正确答案。