Sieb des Eratosthenes

info=)

Mitglied
Hallo,
Ich muss eine Hausaufgabe erledigen, in der es darum geht aus einen Feld alle Primzahlen mit Hilfe des Siebes von Eratstohones zu finden und die nicht-Primzahlen zu löschen. Dabei sollte ich zwei Felder verwenden ( hier: zahl und prüfung).
Dazu habe ich schon versucht, eine Klasse mit implementierten Methoden zu erstellen, aber nicht das gewünschte Ergebnis erhalten.
Mein Vorschlag:
Java:
public class SIEB{
private int [] zahl;
private boolean[] prüfung;

public SIEB(int n){
zahl= new int [n];
prüfung= new boolean [n];
}

private void setzen(){
for(int i=2; i<zahl.length; i=i+1){
    prüfung[i]=true;
    }
for(int i=2; i<zahl.length; i=i+1){
    zahl[i-2]=i;
}
}

private void primzahlenBestimmen(){
for(int p=0; p<zahl.length; p=p+1){
    if (prüfung[p]){
        for(int v=2*p; v<zahl.length; v=v+p){
            prüfung[v]=false;
        }
    }
}
}

private void primzahlenAusgeben(){
for (int i=0; i<zahl.length; i=i+1){
    if (prüfung[i]){
        System.out.println(zahl[i]);
    }
}
}

public void primzahlenErmitteln(){
setzen();
primzahlenBestimmen();
primzahlenAusgeben();
}
}


Kann mir jemand bitte helfen, meinen Fehler zu finden?
Für Eure Mühe schon einmal Danke im voraus!
 
W

Wishmaster51

Gast
Wie rufst du dein Programm denn auf? Es fehlt die Main-Methode in diesem Beispiel
 
I

IMartin

Gast
"zahl" wird mit einem Offset von -2 initialisiert:
[JAVA=15]zahl[i-2]=i;[/code]
Die Ausgabe erfolgt aber ohne:
[JAVA=32]System.out.println(zahl);[/code]

Möglichkeiten:
  • An beiden Stellen -2.
  • An beiden Stellen keine -2.
  • "zahl" weglassen. Primzahlen stecken im Index von "prüfung".
 

info=)

Mitglied
Vielen Dank, habe bei
Java:
System.out.println(zahl[i]);
noch -2 angefügt.

Jetzt habe ich aber noch ein kleines Problem. Wenn ich bei
Java:
for(int i=2; i<zahl.length; i=i+1)
;
Java:
for(int p=0; p<zahl.length; p=p+1)
und bei
Java:
for (int i=0; i<zahl.length; i=i+1)
jeweils
Java:
i<=zahl.length
schreiben würde, erhalte ich folgende Meldung: java.lang.ArrayIndexOutOfBoundsException
Ich hätte also dir Größe des Feldes überschritten, aber dabei habe ich doch im Prinzip nur die Wiederholung geändert(1-mal mehr). Irgendwie verstehe ich das jetzt nicht.
 

info=)

Mitglied
Und was ist dann mit
Java:
for(int i=2; i<zahl.length; i=i+1)
? Müsste ich da nicht <= schreiben?
 

luk_h

Mitglied
Fu3L hat es schon gesagt:

wenn du ein array der größe 5 hast, zB
Java:
int[] array = new int[3]
dann wird dir das attribut array.length 3 zurückgeben. Du darfst aber nicht auf das Element nummer 3 zugreifen, weil man beim array mit 0 anfängt zu zählen.
In meinem Beispiel gibt es nur die folgenden plätze: array[0], array[1] und array[2]. Wenn du jetzt bei deiner for-schleife schreibst:

Java:
i<=zahl.length
dann würdest du in meinem Beispiel auf das Element array[3] zugreifen, also den 4. Platz. Da aber oben das Array nur 3 Plätze hat, bekommst du hier eine ArrayIndexOutOfBoundsException.
 
V

vanny

Gast
das erste Feld (also Feld nr. 1 im menschlichen Denken) ist bei Index 0.

ergo ist Feld nr. 5 bei index 4 usw.

also ist array.length (zbsp. 10) bei index 9 also maximal bis i<array.length (im Beispiel i<10 also maximal 9).

Du fängst halt bei 0 an zu zählen und nicht bei 1.

Gruß Vanny

[EDIT]und i = i+1 kannste auch in Kurzschreibe mit i++ ausführen[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Christiane23

Neues Mitglied
Hallo,
Ich muss eine Hausaufgabe erledigen, in der es darum geht aus einen Feld alle Primzahlen mit Hilfe des Siebes von Eratstohones zu finden und die nicht-Primzahlen zu löschen. Dabei sollte ich zwei Felder verwenden ( hier: zahl und prüfung).
Dazu habe ich schon versucht, eine Klasse mit implementierten Methoden zu erstellen, aber nicht das gewünschte Ergebnis erhalten.
Mein Vorschlag:
Java:
public class SIEB{
private int [] zahl;
private boolean[] prüfung;

public SIEB(int n){
zahl= new int [n];
prüfung= new boolean [n];
}

private void setzen(){
for(int i=2; i<zahl.length; i=i+1){
    prüfung[i]=true;
    }
for(int i=2; i<zahl.length; i=i+1){
    zahl[i-2]=i;
}
}

private void primzahlenBestimmen(){
for(int p=0; p<zahl.length; p=p+1){
    if (prüfung[p]){
        for(int v=2*p; v<zahl.length; v=v+p){
            prüfung[v]=false;
        }
    }
}
}

private void primzahlenAusgeben(){
for (int i=0; i<zahl.length; i=i+1){
    if (prüfung[i]){
        System.out.println(zahl[i]);
    }
}
}

public void primzahlenErmitteln(){
setzen();
primzahlenBestimmen();
primzahlenAusgeben();
}
}


Kann mir jemand bitte helfen, meinen Fehler zu finden?
Für Eure Mühe schon einmal Danke im voraus!
Hey , ich habe auch diese Aufgabe schon gehabt und habe es so gemacht. Ich hoffe es kann dir helfen



import java.util.*;

public class Era
{
public static void run (String []args)
{
int max=100;
boolean []istPrim= new boolean [max];
erzeugen(istPrim);

}
public static void erzeugen(boolean []istPrim)
{
for (int i=2; i<istPrim.length;i++)
{
istPrim=true;
}
for (int i=2; i<istPrim.length;i++)
{
for (int j=2;i*j<istPrim.length;j++)
{
istPrim[i*j]=false;

}


}
for(int i=2;i<istPrim.length;i++)
{
System.out.println(i);
}

}

}
 

Ähnliche Java Themen

Neue Themen


Oben