Frage

Ich bin sowohl das Erlernen der JPDA auf Netbeans zu verwenden, und die Lösung des Prime Generator Problem der Online Richter Sphere.

Ich habe gelesen dieses Tutorial auf netbeans.org über er JPDA, haben aber nicht viel helfen gefunden.

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

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 dieses Stück Code verdächtig, verursachen ehrlich, ich verstehe nicht ganz, es:

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

        }

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

primes.get(j)==false

Aber ich bin nicht sicher, ob ich in der Lage sinnvolle Informationen auf diese Weise zu erhalten. Dies sind die Bildschirme erhalte ich:

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 aus dieser erhalten.

Meine Fragen sind:

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

Wie kann ich das tun?

b) Was ist mit diesem Code genau falsch ist? Wie haben Sie vor Ort den Debugger?

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

War es hilfreich?

Lösung

Also, extrahierte 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 verändert die main() Methode aufrufen nur, dass mit ein paar beliebige Argumente (10 und 100), weil ich nicht zu verwirren wollte, um mit der Konsole und dem Debugger zur gleichen Zeit. Ich habe dann (ich verwende Eclipse) setzt gewöhnliche Haltepunkte an den Anfang und das Ende Linien ApproximateNthPrime(), SieveOfEratosthenes() und GeneratePrimesSieveOfEratosthenes() um sicherzustellen, dass sie genannt wurden. (By the way, Java-Konvention, im Gegensatz zu C #, ist für Namen Methode mit einem Kleinbuchstaben zu beginnen.)

Alles war ohne den Code zu verstehen, zu belästigen. :) Doch nach dem ersten Durchgang war es ziemlich klar, dass das Problem ist, dass die BitSet von SieveOfEratosthenes() produziert immer leer ist (oder besser gesagt, immer ganz false). Ich habe nicht den NetBeans-Debugger verwendet, aber ich vermute, das „Lokale Variablen“ -Reiter ist dein Freund hier.

Ich werde nicht Ihre Hausaufgaben für Sie tun. :) Aber die Idee des Sieb des Eratosthenes ist die Primzahlen zu überspringen und nur die nicht-Primzahlen zu beseitigen. Untersuchen Sie Ihre SieveOfEratosthenes() Methode und sich fragen: wann wird es eine Reihe überspringen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top