2009-07-03 7 views
0

Ich lerne beide, die JPDA auf Netbeans zu verwenden und das Prime Generator Problem von Sphere's Online Judge zu lösen.Lernen, in Java zu debuggen

Ich habe gelesen this tutorial on netbeans.org über er JPDA, aber habe es nicht viel Hilfe gefunden.

Dieser Code, der auf einem Sieb des Eratosthenes Implementierung von Starblue here bereitgestellt basiert, wird wie folgt ausgeführt:

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 

    } 
    } 
} 

Ich weiß, dass die Arraylist primesList nicht initialisiert zu werden, und ich bin misstrauisch dieses Stück Code, verursachen ehrlich, ich es nicht ganz verstehen:

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

     } 

es fiel mir ein, einen bedingten Haltepunkt hier mit der Bedingung zu verwenden:

primes.get(j)==false 

Aber ich bin mir nicht sicher, ob ich auf diese Weise aussagekräftige Informationen bekommen kann. Dies sind die Bildschirme Ich erhalte:

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

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

Ich weiß nicht, wie nützliche Informationen, um aus dieser.

Meine Fragen sind:

a) ich die Primzahlen als gehen durch diese Schleife BitSet sehen wollen.

Wie mache ich das?

b)Was genau stimmt mit diesem Code nicht? Wie haben Sie es mit dem Debugger entdeckt?

Bitte erwähnen Sie den Schritt-für-Schritt-Prozess.

Antwort

1

So extrahiert ich folgendes Verfahren aus:

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)); 
    } 
} 

und änderte die main() Methode aufrufen nur, dass mit ein paar beliebige Argumente (10 und 100), weil ich nicht zu verwirren wollte mit der Konsole und dem Debugger gleichzeitig umgehen. Ich stelle dann (ich benutze Eclipse) normale Haltepunkte an die Anfangs- und Endzeilen von ApproximateNthPrime(), SieveOfEratosthenes() und GeneratePrimesSieveOfEratosthenes(), um sicherzustellen, dass sie aufgerufen werden. (Übrigens ist Java-Konvention, anders als C#, für Methodennamen, mit einem Kleinbuchstaben zu beginnen.)

All das war, ohne sich darum zu kümmern, den Code zu verstehen. :) Allerdings war nach dem ersten Durchlauf klar, dass das Problem darin liegt, dass die BitSet von SieveOfEratosthenes() immer leer ist (bzw. immer ganz false). Ich habe den NetBeans-Debugger nicht verwendet, aber ich vermute, dass der Tab "Lokale Variablen" hier dein Freund ist.

Ich werde deine Hausaufgaben nicht für dich machen.:) Aber die Idee des Sievers von Eratosthenes besteht darin, die Primzahlen zu überspringen und nur die Nicht-Primzahlen zu eliminieren. Untersuchen Sie Ihre SieveOfEratosthenes() Methode und fragen Sie sich: Wann wird eine Nummer übersprungen?