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.