【发布时间】:2015-10-25 17:32:56
【问题描述】:
我正在尝试制作一个程序,使用 Eratosthenes 的筛子计算不超过整数的素数数量。虽然我的程序对于小数字运行良好(并且快速),但在某个数字(46337)之后,我得到一个“命令由信号 11 终止”错误,我认为这与数组大小有关。我尝试使用 malloc() 但我没有完全正确。大数字(高达 50 亿)我该怎么办?
#include <stdio.h>
#include<stdlib.h>
int main(){
signed long int x,i, j, prime = 0;
scanf("%ld", &x);
int num[x];
for(i=2; i<=x;i++){
num[i]=1;
}
for(i=2; i<=x;i++){
if(num[i] == 1){
for(j=i*i; j<=x; j = j + i){
num[j] = 0;
}
//printf("num[%d]\n", i);
prime++;
}
}
printf("%ld", prime);
return 0;
}
【问题讨论】:
-
数组索引从 0 到 size 减一。
-
'for(i=2; i
-
哦...我的速度不够快。在检查 for 循环索引之前,我浪费了时间检查 strlen/sizeof(pointer):(
-
@JoachimPileborg 我认为这不是问题,因为它适用于最多 46337 的每个数字
-
如果您使用单个位而不是整个 int 来存储 0 或 1,大数字将起作用。也许是
std::vector<bool>的少数几个好的用途之一?
标签: c primes sieve-of-eratosthenes