Java - Primzahlen Code Fehler?

fdfd - (programmieren, Informatik, Java)

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Es fehlen einige Klammern und ein paar andere Sachen.

Ich Versuchs mal kurz nach und nach. Wie man die Klammern richtig setzt wurde ja schon in den anderen Antworten beschrieben.

1. : Du definierst eine Variable "rest" innerhalb einer If-Else Verzweigung. Je Nachdem wie du das Ganze aufbauen möchtest musst du die "Sichtbarkeit" von Variablen beachten.
z.B:

int a = 3;
if(a < 2)
{
   int foo = 12;
} else {
  foo = 24;
}

Hier hättest du das Problem, dass "foo" im "ELSE" Teil gar nicht sichtbar ist. Du kannst ihm also keine Variable zuweisen. Das liegt vor allem daran, dass "foo" gar nicht deklariert wird, schließlich ist a > 2.

Der Zweite Aspekt ist deine Deklarierung von "rest" als Integer. Dies ist selten eine gute Idee, weil Integer keine Nachkommastellen haben. Die Division von 1 / 2 wäre somit 0. Was mathematisch gesehen Falsch ist. Hier kannst du mehr dazu lesen: http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/division_java_de

Der Dritte Punkt hier ist noch, dass du wahrscheinlich eine Division mit Rest haben wolltest und keine normale Division. Das ganze nennt sich "Modulo" und wird in Java mit "%" geschrieben.

2.: Hier ist eher ein inhaltlicher Fehler. Du Prüfst nur ob b < 2 ist. Du weißt also nur ob "b" negativ, 0 oder 1 ist. Es gibt dir aber keinerlei Aufschluss darüber ob es eine Primzahl ist. Man sollte also am besten die Ausgabe anpassen, wie z.B. "Ungültige Zahl. Bitte eine positive Zahl größer 1 eingeben." 

Woher ich das weiß:Berufserfahrung – Java Entwickler
Code mit Anmerkungen - (programmieren, Informatik, Java)

Wie priesterlein schon sagte, fehlt eine geschweifte Klammer zu.

if (bla < blub)
{
   for(int i = 2; i < lol; i++)
   {
      lol = rest * lol;
   }
}
else if (kjasfda < fskahnas)
{
   // ...
}
else
{
   // ...
}

So in etwas müsste es aussehen.

Achte auch unbedingt auf die richtige Einrückung deines Codes. Das sieht nicht nur besser aus, sonder ist auch besser lesbar und besser nachvollziehbar :DDD

Woher ich das weiß:Studium / Ausbildung – Informatik-Studium / Mathematik-Studium / ITK-Ausbildung

Lokale Felder existieren nur in dem Bereich, also den geschweiften Klammern, in dem sie deklariert werden.

{ int rest = 0; }

Hier existiert das lokale Feld "rest" nur innerhalb der geschweiften Klammern.

Bei Schleifen ist das nicht anders:

for(int i = 0; i < length; ++i){ int rest = 0 }

Hier hast du auch geschweifte Klammern, die das umhüllen, was in jedem Schritt der Schleife passiert, sprich, du legst den Rest jedes Mal neu an.

Um das zu vermeiden und auf das Feld außerhalb der Schleife zugreifen zu können, musst du das lokale Feld in einem Bereich anlegen, der übergeordnet ist:

{ 
int rest = 0;
for( int i = 0; i < length; ++i){
rest = ...
}
}

Nach dem Semikolon fehlt eine geschweifte geschlossene Klammer, denn immerhin hast du ja beim for eine aufgemacht und das else passt nicht zum for sondern zum if davor.

Das ganze Konstrukt ergibt keinen Sinn, denn du hast keinen rest, wenn du den rest benutzt.

priesterlein  12.09.2017, 22:17

Falls du die for-Schleife minimal optimieren willst, definiere rest außerhalb und brich ab, wenn rest < i wird statt i bis zum b hochzuzählen.

0
priesterlein  12.09.2017, 22:24

Achja, das i++ ist großer Quatsch, du musst ja nur die 2 und sonst ungerade Zahlen testen. Die geraden Zahlen sind vergeudete Zeit.

0