2016-07-23 13 views
2

Ich bin nur ein Anfänger in Java. Ich habe versucht, einen Primzahlprüfer mit dem zu bauen, was ich bereits kenne. Ich habe eine Methode verwendet, die die Quadratwurzel der gegebenen Zahl findet und dann die Zahl mit allen ganzen Zahlen kleiner als diese Wurzel teilt, und wenn in jedem Fall die Antwort "0" ist, dann ist die Zahl keine Primzahl; ansonsten ist es so.Primzahl-Checker mit Java


Mein Programm funktioniert gut mit Integer-Datentyp bis zu no.2147483647 aber nach dieser Nummer für jede Zahl gibt es die gleiche Leistung wie -> „Ja !! Die Zahl ist eine Primzahl“. Aus diesem Grund habe ich versucht, double-Datentyp zu verwenden, aber das Ergebnis ist immer noch das gleiche! Für jede Zahl nach 2147483647 heißt es, es ist eine Primzahl.


Frage: nach Math.floor() und double verwenden, eine größere abgerundet Nummer zu speichern, wenn ich meine drucken ArrayList es zeigt Element „0“ drin, aber das in Endergebnisses Zustand if (contains(0) == true) umgangen wird und if (contains (0) == false) ist für Zahlen implementiert mehr als 2147483647


Erste-Code mit dem Integer Datentyp:

import java.util.ArrayList; 
import java.util.Scanner; 
public class UltimatePrime { 
    public static void main (String[] args) 
    { 
     int mod; 
     Scanner input = new Scanner(System.in); 
     int number = (int) input.nextDouble(); //separate and get only integer part from the input 

     if (number >= 2 && number < 2147483647) //2147483647 is the limit for data type Integer 
     { 
      int j = (int) Math.sqrt(number); //get the integer square root of the input and assign it to j 
      ArrayList modStorage = new ArrayList(); 
      for (; j>1; j--) 
      { 
       mod = number % j; //divide the number with all numbers less than or equal to j 
       modStorage.add(mod); //store all modulus or remainder operator results in ArrayList modStorage 
      } 
       if (modStorage.contains(0) == true) //if ArrayList modStorage contains 0 remainder than result = true 
       { 
        System.out.println("Sorry" + ", " + number + " " + "is not a prime number."); 
       } 
       if (modStorage.contains(0) == false) //if ArrayList modStorage doesn't contain 0 remainder than result = false 
       { 
        System.out.println("Yes!!" + " " + number + " " + "is a prime number."); 
       } 
      } 

     else if (number == 1) //special case for number 1 
     { 
      System.out.println("A prime number has only two factors: 1 and itself." 
        + "\nA composite number has more than two factors." 
        + "\nThe number 1 is neither prime nor composite."); 
     } 

     else //insuarace :D 
     { 
      System.out.println("Please enter proper number!"); 
     } 

     input.close(); 
    } 
} 

Second-Code mit double:

import java.util.ArrayList; 
import java.util.Scanner; 
public class FinalPrime { 
    public static void main (String[] args) 
    { 
     double mod; 
     Scanner input = new Scanner(System.in); 
     double number = input.nextDouble(); //separate and get only integer part from the input 
     number = Math.floor(number); 
     if (number >= 2) 
      { 
       double j = Math.sqrt(number); //get the integer square root of the input and assign it to j 
       j = Math.floor(j); 
       ArrayList modStorage = new ArrayList(); 
       for (; j>1; j--) 
       { 
        mod = number % j; //divide the number with all numbers less than or equal to j 
        modStorage.add(mod); //store all modulus or remainder operator results in ArrayList modStorage 
       } 
       if (modStorage.contains(0) == true) //if ArrayList modStorage contains 0 remainder than result = true 
       { 
        System.out.printf("%.0f \n",number); 
        System.out.println("Sorry" + ", " + "it is not a prime number."); 
       } 
       if (modStorage.contains(0) == false) //if ArrayList modStorage doesn't contain 0 remainder than result = false 
       { 
        System.out.printf("%.0f \n",number); 
        System.out.println("Yes!!" + ", " + "it is a prime number."); 
       } 
      } 

     else if (number == 1) //special case for number 1 
      { 
       System.out.println("A prime number has only two factors: 1 and itself." 
           + "\nA composite number has more than two factors." 
           + "\nThe number 1 is neither prime nor composite."); 
      } 

     else //insuarace :D 
      { 
       System.out.println("Please enter proper number!"); 
      } 

     input.close(); 
    } 
} 
+1

Sie können long oder BigInteger verwenden, wenn Ihre Methode für große Zahlen benötigt wird. – Eran

+0

Wenn meine Antwort unten Ihnen geholfen hat, markieren Sie bitte die Lösung – xenteros

Antwort

0

Ihr Problem ist int overflow. 2147483647 ist der maximale Wert für int. Dieser Datentyp kann keine größeren Zahlen speichern.

Double sollte für Floating-Nummern verwendet werden.

Für große Ganzzahlen verwenden BigInteger Klasse, die java.math Klasse ist. Diese Klasse kann unendlich große Zahlen speichern, solange Sie genügend Speicher auf Ihrem Computer haben.

EDIT:

Wie Sie verstehen möchten, wie BigInteger Werke, die ich beschlossen, meine Antwort zu bearbeiten und Sie in die Welt der BigInteger s einzuführen. Zuallererst lassen Sie mich versichern: Verstehst du, dass double nicht Typ für größere Ganzzahlen ist? Wenn es genug wäre, können Sie long verwenden, was der Typ für Ganzzahlen größer als int ist.

Wenn long nicht groß genug ist, sollten Sie versuchen BigInteger s. Für riesige float s gibt es BigDecimal Klasse. Konzentrieren wir uns auf BigInteger s.

BigInteger

BigInteger Klasse hat drei public static Felder BigInteger s: ONE, TEN und ZERO.Wenn Sie überprüfen möchten, ob BigInteger gleich 0 ist (ja, BigInteger kann auch kleine ganze Zahlen enthalten), ist es definitiv besser, es mit BigInteger.ZERO zu vergleichen, als das neue Objekt BigInteger(0) zu erstellen.

Baumaschinen

Was Bauer? Es gibt drei am häufigsten verwendete. Die erste nimmt String als Parameter, die zweite nimmt eine String und eine int Radix (Basis des numerischen Systems) und die dritte nimmt Bit-Array.

Die letzte Möglichkeit, die ich verwende BigIntegers zu konstruieren ist ein Verfahren public staticvalueOf() genannt, die long oder int als Parameter nimmt.

BigInteger a = new BigInteger("1024"); // creates BigInteger representing number 1024. 
BigInteger b = new BigInteger(1024); //also creates BigInteger representing number 1024. 
BigInteger c = new BigInteger("10000000000", 2); //also creates BigInteger representing 1024 

Operationen

Um zu überprüfen, ob BigInteger aBigInteger b gleich

geben Sie einfach
if (a.equals(b)) {...} 

zwei a,b Typ

BigInteger c = a.add(b); 
//or 
a = a.add(b); 

Gefühl f s BigInteger hinzufügen Lesen Sie die documentation, die großartig ist! Wie auch immer, wenn Sie irgendwelche Fragen haben, zögern Sie nicht, im Kommentarbereich zu fragen. Ich werde bis Sonntagabend antworten.

+0

danke für die Antwort. Ich bin immer noch nicht sicher, wie man Scanner und BigInteger zusammen benutzt. Nun, was meine Frage ist, dass nach der Verwendung von Double, um größere abgerundete Ganzzahlen zu speichern, wenn ich meine ArrayList drucke es zeigt Element "0" in.Aber die Endergebnisbedingung if (enthält (0) == wahr) ist vorbei und wenn (enthält (0) == false) wird für Zahlen größer als 2147483647 implementiert. –

+0

Bearbeitet. Hoffentlich wird dir helfen! – xenteros

+0

Ich weiß nicht, wie es passiert ist, aber in meinem zweiten Code mit double habe ich gerade if (enthält (0) == true) mit if (enthält (0.0) == true) und es hat funktioniert !! Jetzt gibt mir mein Computer das Limit, um größere Zahlen zu testen: D Jedenfalls habe ich beschlossen, etwas über BigIntegers zu lernen! Danke Ihnen allen für Ihre Hilfe! Speial Xenteros für die Einführung in BigIntegers :) –