2009-07-03 115 views
0

我都學習使用NetBeans上的JPDA和解決球體的在線法官的Prime Generator問題進行調試。學習Java中

我一直在閱讀關於他JPDA的this tutorial on netbeans.org,但沒有找到多大的幫助。

此代碼,這是基於starblue here提供的埃拉託斯特尼篩的實施,運行這樣的:

2 
1 10 
//here the primes between 1 and 10 should print 
3 5 
//here the primes between 3 and 5 should print 




package sphere; 

/** 
* 
* @author Administrator 
*/ 
//import java.util.ArrayList; 
import java.util.BitSet; 
import java.lang.Math.*; 
import java.util.ArrayList; 

public class Main 
{ 

    public static int ApproximateNthPrime(int nn) 
{ 
    double n = (double)nn; 
    double p; 
    if (nn >= 7022) 
    { 
     p = n * Math.log(n) + n * (Math.log(Math.log(n)) - 0.9385); 
    } 
    else if (nn >= 6) 
    { 
     p = n * Math.log(n) + n * Math.log(Math.log(n)); 
    } 
    else if (nn > 0) 
    { 
     p = new int[] { 2, 3, 5, 7, 11 }[nn - 1]; 
    } 
    else 
    { 
     p = 0; 
    } 
    return (int)p; 
} 

// Find all primes up to and including the limit 
public static BitSet SieveOfEratosthenes(int limit) 
{ 
    final BitSet primes = new BitSet(); 
    primes.set(0,false); 
    primes.set(1,false); 
    primes.set(2,limit,true); 

    for (int i =0; i*i<limit;i++) 
    { 
     if (primes.get(i)) 
     { 
      for (int j=i*1; j<limit;j+=1) 
      { 
       primes.clear(j);// hace que el indice j sea false (no primo) 
      } 

     } 

    } 
    return primes; 
} 

public static ArrayList<Integer> GeneratePrimesSieveOfEratosthenes(int n) 
{ 
    int limit = ApproximateNthPrime(n); 
    BitSet bits = SieveOfEratosthenes(limit); 
    ArrayList <Integer> primes = new ArrayList<Integer>(); 
    for (int i = 0, found = 0; i < limit && found < n; i++) 
    { 
     if (bits.get(i)) 
     { 
      primes.add(i); 
      found++; 
     } 
    } 
    return primes; 
} 





    public static void main (String[] args) throws java.lang.Exception 
    { 
    java.io.BufferedReader r = new java.io.BufferedReader (new java.io.InputStreamReader (System.in)); 
    String s; 

    s= r.readLine(); 

    int test_cases = Integer.parseInt(s); 


    int case_counter =0; 

    while (case_counter<test_cases) { 

     // System.out.println(s); 
     s = r.readLine(); 

     String [] splitted = s.split(" "); 

     int lower_bound = Integer.parseInt(splitted[0]); 
     int upper_bound = Integer.parseInt(splitted[1]); 



     ArrayList <Integer> primesList= GeneratePrimesSieveOfEratosthenes(upper_bound); 



     for (int i =0; i<primesList.size();i++){ 
      if (primesList.get(i)<=lower_bound)System.out.println(primesList.get(i)); 
     } 


     case_counter++; 

     System.out.println(" "); // space that separates test cases 

    } 
    } 
} 

我知道ArrayList的primesList是沒有得到初始化,我懷疑的這段代碼,導致老實說,我不太明白:

if (primes.get(i)) 
     { 
      for (int j=i*1; j<limit;j+=1) 
      { 
       primes.clear(j); 
      } 

     } 

它發生在我在這裏使用條件斷點與條件:

primes.get(j)==false 

但我不知道如果我能得到有意義的信息這種方式。這是我收到的畫面:

alt text http://img525.imageshack.us/img525/6238/breakpoints.jpg

alt text http://img98.imageshack.us/img98/5262/watchesz.jpg

我不知道如何擺脫這種有用的信息。

我的問題是:

一)我想看比特集作爲其經歷這個循環中的素數。

我該怎麼做?

B)什麼是錯的正是與此代碼? 你是如何使用調試器發現它的?

請提一步一步的過程。

回答

1

所以,我提煉出來下面的方法:

private static void printPrimes(int lower_bound, int upper_bound) { 
    ArrayList<Integer> primesList = GeneratePrimesSieveOfEratosthenes(upper_bound); 

    for (int i = 0; i < primesList.size(); i++) { 
     if (primesList.get(i) <= lower_bound) 
      System.out.println(primesList.get(i)); 
    } 
} 

,改變了main()方法只是調用與一對夫婦的任意參數(10和100),因爲我不想惹與控制檯和調試器在同一時間。然後我(我正在使用Eclipse)在ApproximateNthPrime(),SieveOfEratosthenes()GeneratePrimesSieveOfEratosthenes()的開始和結束行放置普通斷點,以確保它們被調用。 (順便說一下,與C#不同,Java約定用於以小寫字母開頭的方法名稱。)

所有這些都不需要理解代碼。 :)但是,在第一次運行後,很明顯問題是SieveOfEratosthenes()生成的BitSet始終是空的(或者說,總是完全是false)。我沒有使用NetBeans調試器,但我懷疑「本地變量」選項卡是您的朋友。

我不會爲你做你的功課。:)但是Eratosthenes的Sieve的想法是跳過素數並且只消除非素數。檢查你的SieveOfEratosthenes()方法並問自己:它何時會跳過一個數字?