시브 에라 토 스테 네스 (Sieve Eratosthenes) 방법을 사용하여 최대 20 억 개의 소수를 나열하려고했습니다. 여기 내가 사용한 것입니다!C에서 시브의 방법을 사용하여 최대 20 억의 소수점 표시하기
내가 직면 한 문제는 1,000 만 개가 넘을 수 없다는 것입니다. 내가 시도했을 때, 그것은 'Segmentation Fault'라고 말한다. 나는 그 원인을 찾기 위해 인터넷에서 수색했다. 일부 사이트에서는 컴파일러 자체의 메모리 할당 제한이 있다고합니다. 어떤 이는 하드웨어 제한 사항이라고 말합니다. 4GB RAM이 설치된 64 비트 프로세서를 사용하고 있습니다. 제발 그들을 나열하는 방법을 제안하십시오.
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000000
long int mark[MAX] = {0};
int isone(){
long int i;
long int cnt = 0;
for(i = 0; i < MAX ; i++){
if(mark[i] == 1)
cnt++;
}
if(cnt == MAX)
return 1;
else
return 0;
}
int main(int argc,char* argv[]){
long int list[MAX];
long int s = 2;
long int i;
for(i = 0 ; i < MAX ; i++){
list[i] = s;
s++;
}
s = 2;
printf("\n");
while(isone() == 0){
for(i = 0 ; i < MAX ; i++){
if((list[i] % s) == 0)
mark[i] = 1;
}
printf(" %lu ",s);
while(mark[++s - 2] != 0);
}
return 1;
}
'gdb'를 사용해보세요. 유용한 도구입니다. – banuj
기본적으로 'long int mark [2e9]'로 16GB의 메모리를 요구하고 있다는 것을 알고 있습니까? –
당신은 16 기가 바이트의 메모리를 얻지 않을 것입니다, 특히 스택에는 없습니다. –