2011-10-27 89 views
3

在解決關於Project Euler的問題時,我閱讀了Eratosthenes的篩子。我相信你們知道我在談論哪個問題。 這就是事情。我的代碼設法正確顯示所有素數低於100萬。 但是,當我嘗試相同的實現2百萬它給了我一個分段錯誤... 我有一定的想法,爲什麼錯誤即將到來,但不知道如何糾正它... 這裏是素數的代碼低於100萬。Eratosthenes的篩子

#include<stdio.h> 
int main(void) 
{ 
    int i,k=2; 
    int j; 
    int n=1000000; 
    int prime[2000000]={}; 
    for(i=0;i<n;i++) // initializes the prime number array 
    { 
     prime[i]=i; 
    } 
    for(i=2;i<n;i++) // Implementation of the Sieve 
    { 
     if(prime[i]!=0) 
     { 
     for(j=2;j<n;j++) 
     { 
      { 
       prime[j*prime[i]]=0; 
       if(prime[i]*j>n) 
        break;  
      } 
     } 
     } 
    } 
    for(i=0;i<n;i++) // Prints the prime numbers 
     if(prime[i]!=0) 
     { 
     printf("%d\n"prime[i]); 
     } 
     return(0); 
    } 
} 
+0

難道你去改變'INT N = 1000000;'到'INTñ= 2000000;' – Dave

+1

這看起來像一個可能出邊界數組訪問:'素數[j *素數[i]] = 0'。 – Jon

+1

值得注意的是,你可能應該使用比'int'更多的其他數據類型。 Int不能保證是任何特定的大小,除了16位。作爲一個風格問題,我會推薦32k以上的數字。 – logancautrell

回答

9

你在堆棧中分配一個巨大的數組:

int prime[2000000]={}; 

四個字節次200萬等於8兆字節,這往往是最大堆棧大小。分配不止於此會導致分段錯誤。

您應該分配在堆的陣列,而不是:

int *prime; 
prime = malloc(2000000 * sizeof(int)); 
if(!prime) { 
    /* not enough memory */ 
} 
/* ... use prime ... */ 
free(prime); 
+0

謝謝!...現在可以使用 –

+0

4 * 2 * 10^6 = 7.6 * 2^20 = 7.6MB – Dave