Primzahlenprüfer

mankingwwe

Aktives Mitglied
Nabend ich kann den Fehler in meinem Code nicht finden. Wollte das wenn ich meine Methode durchlaufen lasse, sie mir ein True gibt wenn es eine Primzahl ist und ein False wenn es keine ist.Bei 17 sagt er mir jedoch False, also es sei keine Primzahl. Kann sein das ich es zu kompliziert gemacht habe und es einfacher geht ich würde doch trotzdem gerne meinen Denkfehler wissen.

Java:
public class primzahlen
{
  public static void main(String[] args)
  {

  }
  
  0public static boolean primzahlentester(int x)
  {boolean a = true;
    int p = 0;
    if(x==1||x==2||x==4||x==6||x==8||x==9){ a=false; }
    
    else if(x==3||x==5||x==7){a=true;}
    
    else if(x>9)
    
    {for(int i = 2; i<=9; i++)
      { int f = x%i; //teilt die Zahlen
        int h = primzahlen.Kommazahlenprüfer(f); //Es wird geprüft ob die Zahl eine Kommazahl ist. JA = 1  Nein = 0
        p = p + h; // Wenn es eine Kommazahl ist wird ein Zähler auf p addiert
      }
      if(p==8){a=true;} //Ist in allen acht Durchläufen eine Kommazahl gewesen, handelt es sich um eine Primzahl
        else a = false; //Ansonsten nicht
      }    
    return a;       // Gibt wieder ob es eine Primzahl ist
  }
  
  public static int Kommazahlenprüfer(double zahl)
  {  if( (zahl - (int)zahl) == 0) // zieht den double wert vom int wert ab
    return 0; //Beim Ergebnis 0 gibt es 0 wieder
    else
    return 1; //Ansonsten 1
  }  
  
  
  
}
 
Zuletzt bearbeitet von einem Moderator:

HDGoldi

Mitglied
Es ist zwar nicht genau das gleiche weil ich im Folgenden Code alle Primzahlen zwischen "start" und "end" ausgebe.
Aber das solltest du ganz schnell umbauen können.
Java:
public class Main {

	public static void main(String[] args) 
	{
        int start = 5, end = 2147483647;
        
        if (start % 2 == 0)
            ++start;
        
        for (int x = start; x <= end; x += 2)
        {
            boolean prime = true;
            for (int y = 3; y < x; ++y)
            {
                if (x % y == 0)
                {
                	prime = false;
                	break;
                }
            }
            if (prime && x >= 2)
            {
            	System.out.println(x);
            }
        }	
	}
}
 

Dompteur

Top Contributor
Dein Kommazahlenprüfer gibt immer 0 als Return-Wert. Zumindest solange da keine Ungenauigkeiten bei der Umwandlung von int nach double passieren. Also die Methode macht nicht das, was du erwartest.

Du kannst das reparieren, wenn du die Methode so veränderst:
Java:
  public static int Kommazahlenprüfer(double zahl)
  {  if( zahl == 0) 
          return 0; 
    else
        return 1; 
  }
Dann funktioniert der Code.
Anders als es dein Kommentar suggeriert, dividierst du in Zeile 30 nämlich nicht. Du bestimmst den Rest der Division. Wenn der Rest nun 0 ergibt, ist die geprüfte Zahl keine Primzahl.


Daher kannst du die for-Schleife auch so umformulieren:
Java:
            for(int i = 2; i<=9; i++)     { 
                int f = x%i;   // ermittle den Rest der Division x durch i
                if ( f == 0) {  // Wenn der Rest 0 ist, dann ist es keine Primzahl.
                    a = false;
                }
            }
Das reicht. Du setzt ja a am Anfang auf true. Wenn nun keine Division den Rest 0 ergibt, bleibt a auf true.

Es gibt noch einen anderen Fehler: Da 2 eine Primzahl ist, gehört der Ausdruck "x==2" von der Zeile 23 in die Zeile 25 verschoben.
 

Thallius

Top Contributor
@Goldi

Deine Routine braucht mindestens dreimal so lange wie nötig. Die innere Schleife muss immer nur bis x/3 gehen, denn danach kann nichts mehr kommen.

Gruß

Claus
 

stg

Top Contributor
Deine Methode #primzahlentester() ist in dieser Form schlicht falsch und kann gar nicht funktionieren. Das sieht man allein schon an der Tatsache, dass deine Methode eine konstante Laufzeit bei wachsendem zu prüfenden Integer x besitzt.
Auf die anderen Fehler wurde ja schon eingegangen, daher muss ich dazu ja nix mehr schreiben...
 

Ruzmanz

Top Contributor
Als Ergänzung zu Dompteur:

Es ist grundsätzlich gefährlich einen Double-Wert mit einer Ganzzahl zu vergleichen. Double-Werte können 0.000000000001 enthalten, sodass "x == 0" nicht zutrifft. Deshalb sollte die Methode schon im vorraus ein "int zahl" erwarten. Zudem erfüllt die Methode nicht ihren Zweck. Die Intention der Methode ist eigentlich "istDerQuotientEineGanzzahl", sodass der divident und divisor als Parameter erwartet werden. Des Weiteren möchte man bei so einer simplen Methode keine Logik. Entweder der Quotient ist eine Ganzzahl (true) oder nicht (false). D.h. wir erwarten als Rückgabewert einen Boolean.

Java:
public static boolean istDerQuotientEineGanzzahl(int divident, int divisor) {
    return divident % divisor == 0;
}

Draus folgt:

Java:
                if (istDerQuotientEineGanzzahl(x, i)) {  // Wenn der Rest 0 ist, dann ist es keine Primzahl.
                    return false;
                }

PS: Glaube das a = false stimmt nicht ... habe es aber nicht überprüft und einfach mal ein return false eingefügt.
 
Zuletzt bearbeitet:

Oben