2009-07-03 138 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()方法并问自己:它何时会跳过一个数字?