我已经编写了筛网的代码,但程序仅运行数组大小小于或等于1000000的数据。对于其他较大的情况,会出现一个简单的SIGSEGV。这可以使运行情况> 1000000.或我错在哪里?Eratosthenes的筛子:SIGSEGV?
#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;
}
相关:你一定要明白(或由它的外观你不)在*数据*埃拉托色尼筛可以从字面上是*位* (如果你不想执行位偏移数学,使用'unsigned char')?想想看。它的a * flags *数组,这就是所有。它对你真正关心的数组有*指示。当你所关心的是它们是零还是非零时,存在*没有理由存储64位值。 – WhozCraig
放松:SIGSEGV是最后一个素数。 –
@WhozCraig是的,先生,我意识到了。简单的愚蠢将0/1存储在无符号long long中。 – pukingminion