2013-10-11 79 views
1

我對eratosthenes的篩子有些麻煩。 所以我得到了來自一個名爲「紹姆的大綱」一書篩的數學底子計算,但是我認爲這本書已經編程到代碼錯誤... 這是一本書的代碼:關於Eratosthenes的篩子

public class Sieve 
{ 
    final static int P = 800; 
    static boolean[] isPrime = new boolean[count]; 

Sieve(); 
{ 
    for (int i = 2; i<P; i++) 
    { 
     isPrime[i] = true; 
    } 
    for (int i = 2; i<P/2; i++) 
    { 
     if (isPrime[i]) 
     { 
      for (int j = 2*i; j<P; j += i) 
      { 
       isPrime[j] = false; 
      } 
     } 
    } 
} 
public static void main(String[] args) 
{ 
    new Sieve(); 
    print(); 
} 

static void print() { 
    for (int i=0; i<count; i++) 
     if (isPrime[i]) System.out.println(i + " "); 
     else if (i%90==0) System.out.println(); 
     System.out.println(); 
}} 

因此,我使用了代碼並做了一些細微的修改,因爲「Sieve()」沒有被識別。 這下面是我的代碼:

public class Primenumbers 
{ 
    final static int count = 1000; 
    static boolean[] isPrime = new boolean[count]; 

    public static sieve(int count, boolean isPrime); 
    { 
     for (int i = 2; i<count; i++) 
     { 
      isPrime[i] = true; 
     } 
     for (int i = 2; i<count/2; i++) 
     { 
      if (isPrime[i]) 
      { 
       for (int j = 2*i; j<count; j += i) 
       { 
        isPrime[j] = false; 
       } 
      } 
     } 
    } 
    public static void main(String[] args) 
    { 
     for (int i=0; i<count; i++) 
     { 
      if (isPrime[i]) 
      { 
       System.out.println(i + " "); 
      } 
     } 
    } 
} 

所以......我到底做錯了什麼? 感謝您的幫助!

+1

有什麼問題?編譯器錯誤?運行時異常?錯誤的輸出?還要別的嗎? –

+0

關於公共靜態篩選編譯器錯誤 錯誤:無效的方法聲明;所需的返回類型 – SteelDevil

+0

那麼編譯器消息不夠清楚嗎?你需要給你的'sieve()'方法返回類型。 –

回答

0

what am i doing wrong?

您已定義sieve()但您從不稱呼它。你需要在打印之前調用它:

public static void main(String[] args) 
{ 
    sieve(); // <<== Here 
    for (int i=0; i<count; i++) 
    { 
     if (isPrime[i]) 
     { 
      System.out.println(i + " "); 
     } 
    } 
} 

它在書中工作的原因是初始化已在構造函數中完成。您的修改後的代碼將初始化移入靜態函數,但無法調用該初始化。

您還需要從sieve聲明中刪除參數,因爲它已經可以訪問isPrimecount

另一種方法是完全刪除sieve方法,用靜態初始化程序替換它。取而代之的

public static sieve() 
{ 
    // Code to initialize isPrime 
} 

static 
{ 
    // Code to initialize isPrime 
} 

這一變動使得sieve()方法靜態初始化,它總是什麼都在你的類得到執行之前調用。

+0

好吧,我把它添加到主要的方法,但它仍然在編譯時出現錯誤:'公共靜態篩(int計數,布爾isPrime);' – SteelDevil

+0

@SteelDevil順便說一句,你需要刪除方法amd構造函數聲明分號 - 例如,我敢打賭,你在書中的「Sieve()」後面沒有分號。 – dasblinkenlight

+0

好吧,做到了!但爲什麼你只使用靜態它作爲一種方法做什麼?你能解釋一下嗎? – SteelDevil