Primzahlenberechnung

Anfänger2011

Bekanntes Mitglied
Hallo liebes Forum,

ich hab nur ne kurze Frage. Stimmt mein Code, um eine einzelne Zahl daraufhin zu prüfen, ob es sich um eine Primzahl handelt?

Java:
public boolean divisionsverfahren(int n){
        boolean primzahl = false;
        int ergebnis = 0;
        double wurzel = Math.sqrt(n);
        for(int i=2; i < (int)wurzel; i++){
            double zahl = n % i;
            if(zahl != 0){
                ergebnis++;
            }
        }
        if(ergebnis != 0){
            primzahl = true;
        }
        return primzahl;
    }

Schon mal VIELEN DANK im voraus. :)
 
Zuletzt bearbeitet:

mastercoll5

Aktives Mitglied
es sollte alles richtig funktionieren, wenn eine Zahl übergeben wird, die größer als 2 ist. Man müsste also eigentlich noch abfangen, falls die eingabe 1 ist, da diese ja keine Primzahl ist.

Du könntest das ganze noch schneller machen, indem du direkt einen wert zurück gibst, wenn zahl == 0 ist:

Java:
public boolean divisionsverfahren(int n) {
    if(n == 1) return false;
    double wurzel = Math.sqrt(n);
    for(int i=2; i < (int)wurzel; i++){
        double zahl = n % i;
        if(zahl == 0) return false;
    }         
    return true;
}
 

InfectedBytes

Top Contributor
Ansonsten gibts noch eine Kleinigkeit.
Java:
double zahl = n % i;
Sowohl n als auch i sind integer, daher ist es nicht nötig das Ergebnis als double zu speichern.
Java:
int zahl = n % i;
reicht vollkommen aus
 

Anfänger2011

Bekanntes Mitglied
Danke. An die anfängliche Abfrage, ob n kleiner als 2 ist hatte ich gar nicht gedacht. Müsste es aber nicht Zahl != 0 (Zeile 7) heißen?
 

InfectedBytes

Top Contributor
nope, das stimmt so.
Wenn es 0 ergibt, bedeutet es ja das es Teilbar ist. und wenn es teilbar ist, ist es keine primzahl
 
Zuletzt bearbeitet:

stg

Top Contributor
Deine Schleife bricht zu früh ab, so ist dein Code falsch. Ein weiterer Schleifendurchlauf muss es mindestens noch sein:

Java:
for(int i=2; i <= (int)wurzel; i++) { ... }
 

Anfänger2011

Bekanntes Mitglied
Wenn ich die Methode mit allen Ratschlägen ausführe, dann wird mir aber Beispielsweise ausgegeben, dass es sich bei 4 um eine Primzahl handelt, was ja eigentlich nicht sein kann :)
 

Anfänger2011

Bekanntes Mitglied
Java:
public boolean divisionsverfahren(int n){
        if(n == 1){
            return false;
        }
        
        double wurzel = Math.sqrt(n);
        
        for(int i=2; i <= (int) wurzel; i++){
            double zahl = n / i;
            if(zahl == 0){
                return false;
            }
        }
        System.out.println("true");
        return true;
    }
 

Anfänger2011

Bekanntes Mitglied
Noch eine kurze Frage am Rande: Ich will eigentlich nur ein String in ein int umwandel, aber ich bekomme eine java.lang.NumberFormatException. Was mache ich da falsch?

Java:
int n = 0;
                    String line = "1";
                    if(n < Integer.parseInt(line)){
                        return false;
 

Tobse

Top Contributor
@TE: Dieser Code funktioniert so 100%ig. Bemühe doch mal den Debugger, um zu sehen, welcher String tatsächlich an Integer#parseInt übergeben wird.
 

Anfänger2011

Bekanntes Mitglied
Der String line liest über einen BufferedReader mit readLine eine .txt aus.

Java:
boolean ende = false;
        try{
            BufferedReader reader = new BufferedReader(new FileReader(listfile));
            while(ende == false){
                String line = reader.readLine();
                if(line == null){
                    ende = true;
                    return false;
                }else{
                    if(Integer.parseInt(line) > n){
                        return false;
                    }if(line.equals(String.valueOf(n))){
                        return true;
                    }
                }
            }
            reader.close();
        }catch(IOException x){
            JOptionPane.showMessageDialog(null, "Datei kann nicht gelesen werden.");
        }
 
Zuletzt bearbeitet:

Anfänger2011

Bekanntes Mitglied
Also ich hab das ganze im Debugmodus durchlaufen lassen. Es scheitert daran, dass der String selbst wohl leer ist. Das kann aber nicht sein, denn wenn ich die If-Bedingung mit der Umwandlung String zu Int weglasse, alles wunderbar funktioniert. Sprich es wird was übergeben.

Wo liegt bloß mein Fehler bzw. was kann ich sonst noch probieren????

VIelen Dank für eure Hilfe. :)
 

Flown

Administrator
Mitarbeiter
Was willst du mit dem Codeschnipsel erreichen? Nur die erste Zeile aus einer Datei lesen und danach prüfen ob sie kleiner n ist?
 

Flown

Administrator
Mitarbeiter
Was jetzt passiert ist, das du die erste Zeile einliest und prüfst, dann gibt die Methode den Wert zurück. Aber nur das Ergebnis der Prüfung des !ersten! Wertes.
 
Zuletzt bearbeitet:

Anfänger2011

Bekanntes Mitglied
nein das kann nicht sein ... die while-Schleife geht jede zeile durch und prüft zunächst, ob überhaupt was drinsteht. danach wird geschaut ob n mit der zahl aus der zeile übereinstimmt (-> rückgabe positiver wert) oder ob die zahl bereits größer als n ist (-> false)
 

Anfänger2011

Bekanntes Mitglied
Das ist mir natürlich bewusst ... aber es kommt ja erst zum return wenn einer der folgenden punkte erfüllt ist:

1.sobald eine Zeile leer ist (false)
2.n mit Zahl aus der Zeile übereinstimmt(true)
3.n ist kleiner als Zahl aus der Zeile der ausgelesenen Datei (false)
3.Schleife wird verlassen(false)

Ich hoffe, dass ich eigentlich verstehe was du mir geneau sagen willst ;D
 

Flown

Administrator
Mitarbeiter
Pardon, das war wohl mein Fehler. Die zweifachen if's nacheinander überlesen.

Wenn du Java 7 oder höher verwendest, dann verwende try-resource, dann kann man das doch ein wenig schöner noch gestalten (wenn du schon in int umwandelst, dann kannst du auch dieses vergleichen).

Java:
public boolean method(int n) {
  File file = /*...*/;
  try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
    for (String line = reader.readLine(); line != null; line = reader.readLine()) {
      if (line.isEmpty()) {
        return false;
      }
      int number = Integer.parseInt(line);
      if (number == n) {
        return true;
      } else if (number < n) {
        return false;
      }
    }
  } catch (IOException e) {
    e.printStackTrace();
  }
  return false;
}
 
Zuletzt bearbeitet:

Anfänger2011

Bekanntes Mitglied
Danke deine Version ist irklich übersichtlicher, aber erfüllt genau den selben Zweck ... liegt also nicht an meinen Code. :)

PS: Hab den Fehler gefunden :oops: die erste Zeile in der ausgelesen Datei war leer
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Primzahlenberechnung [Brauche Hilfe] Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben