2016-04-07 4 views
-1

Ich bekomme nicht die Ausgabe, die ich erwarte. Dies ist für einen Primzahltest. Ich bin mir nicht wirklich sicher, was los ist. Entweder funktioniert meine Schleife nicht richtig oder nicht.Vergleich für BigInteger funktioniert nicht

n ist ein BigInteger. Es ist eine zufällig vom Benutzer eingegebene Länge.

public static boolean isPrime(BigInteger n) { 

    BigInteger zero = new BigInteger("0"); 
    BigInteger one = new BigInteger("1"); 
    BigInteger two = new BigInteger("2"); 
    BigInteger three = new BigInteger("3"); 

    System.out.println(n + " Mod 2 " + n.mod(two)); 

    if (n.compareTo(one) == 0 || n.compareTo(one) < 0) { 
     //System.out.println("HIT1"); 
     return false; 
    } else if (n.compareTo(three) == 0 || n.compareTo(three) < 0) { 
     //System.out.println("HIT2"); 
     return false; 
    } else if ((n.mod(two)).compareTo(zero) == 0 || (n.mod(three)).compareTo(zero) == 0) { 
     //System.out.println("HIT3"); 
     return false; 
    } else { 
     System.out.println("Heres n : " + n); 
     return true; 
    } 
} 

Hier ist meine Schleife. Ich weiß jedoch, dass mein Zahlengenerator funktioniert.

do { 
    num1 = generateNumber(p); 
} while (isPrime(generateNumber(p)) == false); 

do { 
    num2 = generateNumber(q); 
} while (isPrime(generateNumber(q)) == false); 
+0

Was ist 'n' zuerst? Außerdem sehe ich hier keine Schleife! –

+1

Welche Eingabe geben Sie, welche Ausgabe erhalten Sie und ** wie ** ist diese Ausgabe nicht Ihren *** Erwartungen ***? –

+0

n ist ein BigInteger. Es ist eine zufällig vom Benutzer eingegebene Länge. –

Antwort

1

Sie nicht testen, ob das Ergebnis der compareTo() gleich -1. Wenn Sie a < b bedeuten möchten, sollten Sie a.compareTo(b) < 0 schreiben. Vergleichen Sie immer mit 0, keine andere Konstante.

+0

Macht Sinn, versuchte es, aber ich bekomme immer noch manchmal. –

0

Nur realisiert, was das Problem war. Ich erzeuge zwei verschiedene Zahlen in der Schleife und in der Schleife. Ich habe den BigInteger fälschlicherweise auch falsch in der Schleife zugewiesen. Ich sollte tun num1 = new BigInteger (generateNumber (p) .toString());

0

Zuerst testen, ob die Nummer 2 ist (wenn es ist, dann ist es prime). Als nächstes testen Sie, ob die Zahl durch 2 teilbar ist (wenn ja, dann ist es nicht prim). Als nächstes iterieren Sie von 3 zu der Quadratwurzel der Zahl in Schritten von 2 Testen der Teilbarkeit mit der ursprünglichen Zahl (wenn es ist, dann ist es nicht prim). Ansonsten ist die Nummer Primzahl. Etwas wie,

public static boolean isPrime(BigInteger n) { 
    final BigInteger two = new BigInteger("2"); 
    if (n.equals(two)) { 
     return true; 
    } 
    if (n.mod(two).equals(BigInteger.ZERO)) { 
     return false; 
    } 
    for (BigInteger i = two.add(BigInteger.ONE); i.multiply(i).compareTo(n) < 1; 
       i = i.add(two)) { 
     if (n.mod(i).equals(BigInteger.ZERO)) { 
      return false; 
     } 
    } 
    return true; 
}