Erste Schritte Sieb des Eratothenes

tony01

Mitglied
Hallo zusammen,
ich versuche gerade das Sieb des Eratothenes durch Array zu programmieren aber irgendwie schaffe ich es nicht. Das Problem soll ohne modulo berechnet werden:
hier ist die Aufgabestelle:

Eratosthenes war ein antiker griechischer Mathematiker, der ungefähr 200 v. Chr. einen Algorithmus
aufstellte, mit dem man sehr effizient aus der Folge der natürlichen Zahlen alle Primzahlen bis zu
einer vorgegebenen Zahl ermitteln kann. Dieser Algorithmus heißt "Sieb des Eratosthenes".

Sieb des Eratosthenes:
1. Schreibe alle natürlichen Zahlen von 2 bis zu einer beliebigen Zahl n auf.
2. Streiche alle Vielfachen von 2 heraus
3. Gehe zur nächstgrößeren nicht gestrichenen Zahl und streiche alle Vielfachen von ihr heraus
4. Wiederhole 3 so lange, bis du keine Vielfachen streichen konntest.
5. Alle übrig gebliebenen Zahlen sind Primzahlen.

Implementieren Sie den Algorithmus in einer Funktion mit dem Prototyp

void siebe(int[] arr);

Festlegen des Index n, Aufruf des Algorithmus und Ausgabe der Primzahlen sind dann Aufgaben des
Testprogramms, d.h. der main()-Funktion.

Ein paar Tipps:
Statt "Schreibe alle natürlichen Zahlen von 2 bis zu einer beliebigen Zahl auf" nimmt man
programmiertechnisch am besten ein Array, welches man geschickterweise (natürlich im Rahmen
einer Laufschleife) zu Beginn wie folgt initialisiert:
arr[0]=0;
arr[1]=0; // kein Fehler!
arr[2]=2;
arr[3]=3;
:
arr[n]=n;

Statt "Streiche alle Vielfachen heraus" setzt man programmiertechnisch am besten die
entsprechenden Array-Elemente auf 0, um anzuzeigen, dass dieser Wert keine Primzahl ist. Also
(natürlich wiederum im Rahmen einer Laufschleife):
arr[4] = 0;
arr[6] = 0;
:
Dann sind alle Arrayelemente, die am Ende des Algorithmus noch ungleich 0 sind, die gewünschten
Primzahlen.

Testen nicht vergessen!



hier ist mein Versuch.


Java:
public class SiebDesEratothenes {

	

	public  void sieb(int [] arr)
	{
		int prim = 2;
		int idx;
		int max = arr.length;
		
		for(idx = 2; idx < max; idx++) // Alle natürlichen Zahlen von 2 bis max
		{
			
			for(idx = 2; (idx * 2) > max; --idx)
			{
				arr[idx * 2] = 0;
				
				while(arr[idx] == 0)
				{
					arr[idx]++;
				}
				for(arr[idx] = 2; arr[idx * idx] < max; arr[idx]++)
				{
					while(arr[idx] != 0)
					{
						arr[idx] = prim;
						System.out.print(prim);
					}
					System.out.println();
				}
			}
		}
		
	}
	
	public static void main(String[] args) {
		
		SiebDesEratothenes se = new SiebDesEratothenes();
		
		int max = 120;
		se.sieb(new int[max]);
		System.out.println(se);
		
		
	}

}

es würde mich sehr freuen, wenn ihr mir helfen könntet:
wäre auch nett , wenn ihr ein paar Erklärungen dazu schreibt.

Danke.
 
Zuletzt bearbeitet:
M

Marcinek

Gast
Der Link in meiner Signatur zeigt, wie man ein Forum benutzt.

Vorab eine Frage an dich: Denkst du, dass du der erste bist, der so ein Programm schreibt?
 

AquaBall

Top Contributor
1) Formatiere deine Text mit den Icons über dem Einagbefeld
Java:
foo() {
// So soll Code aussehen
}

2) Du verwendest
Code:
idx
2 mal als Schleifen-Index, das geht schief.

3) "
Code:
wenn sie mir helfen könntet
" Dazu musst du dein Problem beschreiben, bzw. Fragen stellen.


Den Rest hab ich nicht genauer durchgesehen.
 

Volvagia

Top Contributor
Ein paar Fragen:

Warum ignorierst du riesigen roten Text?
Warum gibst du den Variablen keine Namen die auch etwas ausdrücken?
Warum setzt du die Durchlaufvariable der ersten Schleife in der inneren zweiten Schleife immer zurück?
Warum ein Int? Da reicht doch eine boolean: Am Anfang alles false, was es nicht sein kann auf true und was am Ende noch false ist ist ne Primzahl.
Warum definierst du eine Methode statisch und erzeugst dann eine Instanz um sie aufzurufen?
Warum willst du SiebDesEratothenes.toString ausgeben?
 

Ähnliche Java Themen

Neue Themen


Oben