Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen

fendix

Mitglied
Hi,

und zwar habe ich nach der Vorgehensweise von Eratosthenes versucht, Primzahlen zu ermitteln. Leider erhalte ich immer eine Exception: "java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 20". Meiner Meinung nach verhindere ich durch die if-Anweisung die Exception.
Fehlerzeile: speicher[b-1] = 0;

Hätte jemand einen Tipp für mich?


[CODE lang="java" highlight="21"]public static void main(String[] args){
int n = 20;
int[] speicher = new int[n];
primzahlen(speicher, n);
printArray(speicher);
}

public static void primzahlen(int[] speicher, int n){
for(int i = 1; i <= speicher.length; i++){
speicher[i-1] = i;
}
for(int i = 0; i <= speicher.length - 1; i++){
if(speicher == 1){
speicher = 0;
}

int b = speicher;
do {
if((b + speicher) <= n){
b += speicher;
speicher[b-1] = 0; //Vermutlich der Fehler.
} else {
break;
}
} while(b < n);
}

}[/CODE]
 
Naja du fängst ha bei speicher[0] an, was erstmal 1 ist (durch Zeile 9-11). In Zeile 11 setzt du diesen Wert auf 0. Entsprechend wird b in Zeile 17 zu 0. Zeile 19 Bedingung wird true, da 0 + 0 kleiner 20 ist. b += 0 verändert b nicht (Zeile 20), b bleibt 0. In Zeile 21 greifst du daher auf den Index -1 zu. Der Fehler fliegt.

Mein Tipp an der Stelle wäre:
halte dich an den Pseudo Code: https://de.wikipedia.org/wiki/Sieb_des_Eratosthenes
 
Zuletzt bearbeitet:
for(int i = 1; i <= speicher.length; i++){

for(int i = 0; i <= speicher.length - 1; i++){
das passt nicht
for(int i = 1; i <= speicher.length-1; i++){

for(int i = 0; i <= speicher.length; i++){
macht mehr sinn
Beide Indizes passen schon, beim ersten wird von Index noch eins abgezogen, läuft also auch von 0 bis speicher.length-1, und beim zweiten passt das speicher.length - 1, da <= als Bedingung genutzt wird.

Beide Schleifen wären aber mit < deutlich schöner, und erstere wäre mit Start bei 0 auch verständlicher, dann müsste man nur den Schleifenkörper anpassen 🙂
 
Beide Indizes passen schon, beim ersten wird von Index noch eins abgezogen, läuft also auch von 0 bis speicher.length-1, und beim zweiten passt das speicher.length - 1, da <= als Bedingung genutzt wird.

Beide Schleifen wären aber mit < deutlich schöner, und erstere wäre mit Start bei 0 auch verständlicher, dann müsste man nur den Schleifenkörper anpassen 🙂
Ich hatte es gelöscht weil ich eigentlich gedanklich umschweifen wollte:

Ist es das Ziel zu schauen ob es eine Primzahl IST oder was die Nächste Primzahl sein wird

In beiden Fällen gibt es Bessere Möglichkeiten es umzusetzen
 
Zuletzt bearbeitet von einem Moderator:
Ist es das Ziel zu schauen ob es eine Primzahl IST oder was die Nächste Primzahl sein wird
nach der Vorgehensweise von Eratosthenes versucht, Primzahlen zu ermitteln

Du hast ein Array und aus diesem Array ist immer das erste nicht gestrichene Element eine primzahl. Dann streichst du die Vielfachen dieser Zahl im Array. Du schreitest im nächsten Durchlauf zum nächsten nicht gestrichenen Element fort und wiederholst das.

Für seine 20:

Ausgangszustand:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Durchlauf 1: 2 ist Primzahl, Vielfache streichen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Durchlauf 2: 3 ist Primzahl, Vielfache streichen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Durchlauf 3: keine weitere nicht gestrichene Zahl bis zur Wurzel (~4,47) gefunden, alle noch nicht gestrichenen Zahlen sind Primzahlen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 
Zuletzt bearbeitet:
Vielen Dank für eure Denkanstöße. Ich habe die Bedingungen in der do while Schleife angepasst. Jetzt klappt alles.

[CODE lang="java" highlight="2"]do {
if((b + speicher) <= n && speicher != 0){
....
} else {
...
}
} while();[/CODE]
 

Zurück
Oben