【发布时间】:2013-08-29 21:02:52
【问题描述】:
我已经编写了筛子的代码,但程序仅针对小于或等于 1000000 的数组大小运行。对于其余较大的情况,会发生简单的 SIGSEGV。这可以运行案例 > 1000000。或者我错在哪里?
#include <stdio.h>
int main()
{
unsigned long long int arr[10000001] = {[0 ... 10000000] = 0};
unsigned long long int c=0,i,j,a,b;
scanf("%llu%llu",&a,&b);
for(i=2;i<=b;i++)
if(arr[i] == 0)
for(j=2*i;j<=b;j+=i)
arr[j] = 1;
for(i=(a>2)?a:2;i<=b;i++)
if(arr[i] == 0)``
c++;
printf("%llu",c);
return 0;
}
【问题讨论】:
-
相关:您确实意识到(或从外观上看您不知道)数据in一个eratosthenes筛子实际上可以是bits,(如果您不想进行位偏移数学,请使用
unsigned char)?想想看。它是一个 flags 数组,仅此而已。它是您真正关心的数组的indicies。当您只关心它们是零还是非零时,没有理由存储 64 位值。 -
放松:SIGSEGV 是最后一个素数。
-
@WhozCraig 是的,先生,我意识到了。将 0/1 存储在 unsigned long long 中是愚蠢的。
标签: c