For-Schleife welche erkennt ob es eine Primzahl ist oder nicht!?

8 Antworten

Eine Primzahl definiert sich dadurch das sie nur durch eins und sich selbst teilbar ist. Das kannst du dementsprechend für die jeweilige Zahl überprüfen.


User785302 
Beitragsersteller
 02.02.2018, 15:26

Das weis ich ich meine ich brauche hilfe beim Programm schreiben ich kenne mich bei den codes nicht gut aus

Es kommt darauf an mit welcher Sprache ihr programmiert.

Allgemein sind bloß die Überprüfungsinstanzen einer Primzahl das Entscheidende.(google diese nach und setze sie in If-Abfragen)

Die Forschleife dient dazu über eine Liste von Zahlen zu iterieren, welche dann in der scope dieser überprüft werden.

Aber deine Frage ist zu wage ausgedrückt.

Ich nehme auch einmal an, dass du eine Liste mit den zutreffenden Primzahlen willst. Und diese dann zurückgibst.

Ich gehe mal davon aus, dass ihr in Java programmiert, da dies in Schulen oft benutzt wird.

Bin grad im Zug, kanns nicht testen, aber so ungefähr könnte die Methode aussehen:

public ArrayList<int> rimzahlenliste(Integer[] testListe){

ArrayList<int> primList= new ArrayList<int>();

For(int listElement:testListe){

//* hier kommen dann deine Abfragen hinein als Ifabfragen bsp. Und anschließend, wenn eine Zahl eine Primzahl ist, dann fügst du sie in primList hinzu mit primList.append(listElement).

So hast du dann eine Liste. Ich weiß leider nur noch ungenau wie das mit den Primzahlen war... Habe das nie gelernt und es auch nie als wichtig betrachtet. Also google nach und dann mach hier deine Abfrage.

*//

}

Return primList;

}

Bei mehr Informationen kann man dir mehr helfen.

Woher ich das weiß:Studium / Ausbildung – Bachelor of Science; currently pursuing my Master of Science

Kampfsorb  02.02.2018, 15:39

Ach okay... c# ist ja anders und unten haste ja bereits Leute, die das Denken sogar für dich übernehmen :D

Antwort einfach ignorieren hihihi

Praktisch musst Du dafür nur überprüfen, ob es mehr als die zwei Teiler 1 und n gibt. Je größer n allerdings ist, desto rechenintensiver wird es.

Der grundsätzliche Algorithmus ist folgender:

  1. überprüfen, ob die Zahl positiv ist
  2. dann intelligent überprüfen, ob es zwischen 1 und der Zahl noch einen weiteren Teiler gibt
  3. wenn ja, dann ist die Zahl nicht prim
  4. wenn nicht, ist die Zahl prim

Probier's damit erstmal selber und schau, ob Du's hinkriegst.

Du laufzeittechnisch beste und verständlichste, die ich hingekriegt habe, ist folgende:

bool isPrim(int n){
    if(n == 2) return true;
    if(n <= 1 || n%2 == 0) return false;
    for(int i=3; i<=i/3; i+=2){
       if(n%i == 0) return false;
    }
    return true;
}

Kleiner Hinweis am Rande: Ich habe die ersten Schritte umgedreht, um dann zwei Bedingungen in eine if-Methode packen zu können und den Code kompakter zu machen. Andersherum würde es aber genauso funktionieren.

  • Zuallererst wird die 2 separat behandelt - ein Sonderfall, nämlich die einzige gerade Primzahl.
  • Dann werden alle negativen Zahlen, alle geraden Zahlen und die 1 als Nicht-Primzahlen zurückgegeben.
  • In der Schleife wird nun jede ungerade Zahl ab 3 aufwärts überprüft, ob sie ein Teiler der betrachteten Zahl ist.
  • Ist das der Fall, hat die Zahl mehr als 2 Teiler und es wird false zurückgegeben.
  • Ist das bis n/3 - die letzte Zahl, die ein Teiler sein könnte - nicht der Fall, ist die Zahl prim.

n/3 ist streng genommen aber sogar noch zu viel des Guten, denn jeder Teiler hat ein Gegenstück. Ist 57 beispielsweise durch 3 teilbar, ist sie auch durch 57/3 = 19 teilbar, was damit einhergeht. Wenn man das auf Primzahlen ohne weitere Teiler überträgt, wäre der eigentliche Endpunkt bei √n. Aber n/3 ist für den Anfang völlig okay, sofern Du mit den betrachteten Zahlen nicht in die Millionenhöhe gehst.

LG


User785302 
Beitragsersteller
 02.02.2018, 16:06

Wow danke dir :)

Am einfachsten: bei zu überprüfender Zahl "n" für jede Zahl "k" von 2 bis n-1 prüfen, ob n durch k ohne Rest teilbar ist.

In üblicher C-ähnlicher Syntax

int n = inputInt();
bool teilbar = false;
for (k=2; k<n; k++) {
  if (istteilbar(n, k)) {teilbar=true;}
}
if (istteilbar) {
  ausgabe("nicht prim");
} else {
  ausgabe("prim");
}
Woher ich das weiß:Berufserfahrung – Software-Entwickler