Sieb des Eratosthenes ohne boolean

CopyPaste

Mitglied
Hey Leute,
ich habe folgende Aufgabe zu lösen und ich komme bei einer Kleinigkeit nicht weiter.
Ich soll mit Hilfe des Siebes des Eratosthenes ein Array mit einer benutzerbestimmten Länge nach Primzahlen filtern und dann ausgeben.

Vorgaben sind drei Methoden zu erstellen nach folgendem Muster:
1. int[] anlegenEinesArrays -->Bentzer gibt n an - Array soll mit den Zahlen von 2 bis n+1 befüllt werden
2. int[] siebDesEratosthenes(int[] zahlen)
3. void ausgabe(int[] zahlen)

main methode:
Java:
  public static void main(String[] args) {
        int[] zahlen = anlegenEinesArrays();
    	zahlen = siebDesEratosthenes(zahlen);
    	ausgabe(zahlen);
  }

es scheint bei mir in einer der Schleifen der siebDesEratosthenes Methode zu scheitern.
hab schon einiges versucht und das ist nur eine der falschen versuche :D
Java:
public static int[] siebDesEratosthenes(int[] zahlen) {
		int k=2;
		for (int i = 2; i < zahlen.length;i++) {
			if (zahlen[i-2] != 0) {	
				for (int j = k*i;j < zahlen.length; k++) {
					zahlen[j-2] = 0;
				}
			}
		}
		return zahlen;
}

Eine zweite Idee wäre:
Java:
public static int[] siebDesEratosthenes(int[] zahlen) {
		for (int i = 2; i < zahlen.length;i++) {
			if (zahlen[i] != 0) {	
				for (int j=2; i*j < zahlen.length; j++) {
					zahlen[i*j] = 0;
				}
			}
		}
		return zahlen;
}
Scheint der Lösung schon näher zu sein, jedoch gibt er einige nicht Primzahlen mit aus.
Das spuckt er aus für die Eingabe von 80 oO
2, 3, 4, 5, 7, 9, 13, 15, 19, 21, 25, 31, 33, 39, 43, 45, 49, 55, 61, 63, 69, 73, 75, 81,



Hoffe ihr könnte mir sagen wie es richtig sein muss. Ich weiß, dass die jetzige Schleife Quatsch ist :p
 
Zuletzt bearbeitet:
P

pappawinni

Gast
Schreib dir doch erstmal auf, wie du genau vorgehen willst.
Sowas nennt sich Pseudocode.
Wenn du dir das dann gut überlegt hast, dann programmiere das.
Wenn dann nicht heraus kommt, was herauskommen soll, musst du halt prüfen,
ob das an deiner Codierung oder an deinem Entwurf liegt.
Beschreibe doch mal wenigstens, was du dir gedacht hast, als du deinen Code hier verbrochen hast.
 

CopyPaste

Mitglied
Okay ich versuch mich mal auszudrücken :D

Als erstes brauche ich eine for-Schleife um die Zahlen im Array durchzugehen
-Start bei Index 0, welches den Wert 2 hat und Ende bei n
-in der Schleife wird mit einer if abfrage geprüft, ob der Zahl im Index i ein Wert != 0 zugeordnet wurde
-das ist wichtig, da später schon mehrere Zahlen durch die zweite for-Schleife auf 0 gesetzt werden -->keine Primzahlen
-in der zweiten for-Schleife sollen nun den Vielfachen der zu prüfenden Zahlen von zahlen der Wert 0 gegeben werden
Somit sollten nach dem ersten Durchlauf alle Vielfachen der 2 zu einer 0 gemacht werden und danach wird das ganze mit der 3 durchlaufen.
Ich denke, dass meine zweite Lösung dem schon sehr nahe ist, jedoch klappt es dennoch nicht

Ich weiß, das ist kein normaler Pseudocode, aber ich hab das Gefühl, so konnte ich mich verständlicher ausdrücken :p

Von mir aus muss nicht sofort die Lösung genannt werden, aber ein guter Tip der in die richtige Richtung führt wäre nett. :)
 
Zuletzt bearbeitet:
T

trääät

Gast
so wird das nicht hinhauen ...

1) der index beginnt bei "0"
2) du hast aber "2" als start-wert ... beginnst also erst beim 3. element ... was den inhalt "4" hat ... darum wird auf jeden fall die 4 drin stehen bleiben ... denn du rechnest ja "2*2" was dann das 5. element ist

ergo : du musst grundsätzlich bei "0" anfangen das array durchzugehen ... nicht erst bei "2" ...

außerdem beißt sich das trotzdem mit deinem vorhaben "ohne bool" denn dein IF ist ein bool .. und auch die runden-bedingungen der loops sind bools ...

also wäre vielleicht auch mal interessant was du mit "ohne bool" meinst ... denn ohne irgendeine art von bool-prüfung wird das nicht möglich sein
 

CopyPaste

Mitglied
Ja hast recht, jedoch entsteht dann das Problem, dass für i=0 im ersten Durchlauf dann 0*k gerechnet wird und dann immer 0 rauskommen wird, selbst wenn k dauernd erhöht wird, oder sehe ich da was falsch? Deswegen kam ich ja erst auf den Unsinn mit i=2 :D

Ohne boolean meine ich nur, dass wenn man bei google mal schaut,es fast nur boolean-Arrays für diese Aufgabe gibt und dann am Anfang allen Werten im Array true zugeordnet wird und dann mit der Schleife, die ich versuche hinzukriegen den nicht-Primzahlen false zuzuordnen. Zum Schluss werden dann alle true Werte ausgegeben.

Das ganze muss ich anstatt mit false mit != 0 hinbekommen und alle nicht-Primzahlen 0 werden lassen.
Zum Schluss dann alle Werte !=0 im Array ausgeben.

Das ist ärgerlich, denn ansonsten hätte ich die Lösung vllt schon längst nachvollziehen können -.-
 
T

träät

Gast
naja gut ...
aber ob ich nun true oder false in ein bool-array schreibe oder "0" bzw "x" macht keinen unterschied ...
 
P

pappawinni

Gast
Also das Sieb hatten wir ja erst..
http://www.java-forum.org/hausaufgaben/143775-primzahlen.html#post962995

und das ein bischen umgebogen sieht dann so aus:

Java:
public class Primes{
    // Sieb des Eratosthenes 
     
    public static void main(String[] args) {
        
        int n = args.length==0? 4000 : Integer.parseInt(args [0]);;
        int z= 0;
        int[] primes = new int[n-1];
        
        for (int i = 2; i <= n; i++) {
            primes[i-2] = i;    
        }
        
        for(int i=2; i <= n; i++) {
            if (primes[i-2]>0) {
                z++;
                System.out.println(primes[i-2] + " is Prime No. "+z);
                if (i <= Math.sqrt(n)) {
                    for (int j = i*i; j <= n; j+=i) {
                        if (j <= n) primes[j-2]=0;
                    }                                       
                }
            }
        }
    }
}

Inwieweit das nun mit deiner Aufgabenstellung harmoniert, darfst du selbst herausfinden.
 

CopyPaste

Mitglied
Sollte schon etwas anders aussehen, aber ich denke ich habs nun hinbekommen:

Java:
public static int[] siebDesEratosthenes(int[] zahlen) {
		for (int i = 0; i < zahlen.length; i++) {
			if (zahlen[i] != 0) {
				for (int j = i + zahlen[i]; j < zahlen.length; j = j + zahlen[i]) {
		                        zahlen[j] = 0;
				}
			}
		}
		return zahlen;
}

Haut soweit hin, nur gehts wahrscheinlich deutlich schöner ;)
 
H

hüteüberhüte

Gast
Wenn ohne boolean, warum nicht mit LinkedList (oder wäre das zu langsam)?:
Java:
        final int n = 97;
        List<Integer> l = new LinkedList<Integer>();
        for (int i = 2; i <= n; i++) {
            l.add(i);
        }

        a:
        for (int i = 0; i < l.size();) {
            final int j = l.get(i);
            final int sqrt = (int) Math.sqrt(j);
            Iterator<Integer> iter = l.iterator();
            int k;
            while ((k = iter.next()) <= sqrt) {
                if (j % k == 0) {
                    l.remove(i);
                    continue a;
                }
            }
            i++;
        }

        System.out.println("l = " + l);
Für Primzahlen bis 97 funktionierts zumindest...
 
H

hüteüberhüte

Gast
Achso, Vielfache von Primzahlen, richtig? Habe das "Sieb" auch nicht mehr so genau in Erinnerung. Danke für den Hinweis. (Wäre das mit Probedivision denn nicht genau so schnell/aufwändig?)
 
H

hüteüberhüte

Gast
Hat ja auch keiner gesagt, dass das trivial ist. :D Aber nö, keine Lust, das jetzt durchzuackern. :D CopyPaste hat ja bereits Lösung.
 
H

hüteüberhüte

Gast
Also entweder ich verstehe das Paper nicht richtig, oder da steht, das Sieb benötigt für 50k 900 Millionen irgendwas und die einfache Divisionsmethode für dieselbe Größe 30 Millionen irgendwas.
 

Landei

Top Contributor
Der englische Wikipedia-Artikel sagt auch etwas in der Richtung, beruft sich aber - oh Wunder - wieder auf das Paper.
 
H

hüteüberhüte

Gast
Also ich erinnere mich daran deshalb nicht mehr so genau, weil das irgendwann in der 5. / 6. Klasse dran kam: Hier sind Kästchen mit Zahlen von 2 bis 99, streicht alle nicht-Primzahlen / Vielfache, und mir das seither nicht mehr begegnet ist.

Wenn ich nicht ganz daneben liege, hat die (etwas verbesserte) einfache Divisionsmethode eine Laufzeit von sqrt(n)*n/4=O(n*sqrt(n)), aber man weiß ja nicht, in welchen Abständen Primzahlen auftreten. Es gibt ja auch nur einen indirekten Beweis, daß Primzahlen nicht-endlich sind.
 
Zuletzt bearbeitet von einem Moderator:

bERt0r

Top Contributor
Ja, auf was ich hinauswollte war das hier:
Java:
public static void sieb(int[] arr)
	{
		for (int i = 4; i < arr.length; i = i + 2)
		{
			arr[i] = 0;
		}
		
		for (int i = 3; i < Math.sqrt(arr.length); i = i + 2)
		{
			if (arr[i] != 0)
			{
				int j = i;
				while (j * i < arr.length)
				{
					arr[j * i] = 0;
					j = j + 2;
				}
			}
		}
	}
 
H

hüteüberhüte

Gast
Hier nochmal die einfache Divisionsmethode:
Java:
    private List<Integer> gibPrimzahlen(int n) {
        ArrayList<Integer> l = new ArrayList<Integer>(/*(int) (n * 0.5)*/);
        l.add(2);
        a:
        for (int i = 3; i <= n; i += 2) {
            final int sqrt = (int) Math.sqrt(i);
            for (int j = 3; j <= sqrt; j += 2) {
                if (i % j == 0) {
                    continue a;
                }
            }
            l.add(i);
        }
        return l;
    }
Geht schon recht flott. Wie lang man die Liste wählen sollte, ist aber glaub ich auch unklar.
 

Landei

Top Contributor
Es gibt ja auch nur einen indirekten Beweis, daß Primzahlen nicht-endlich sind.

Das würde ich so nicht im Raum stehen lassen. Es lässt sich ganz einfach eine unendliche Liste von Primzahlen erzeugen: Nimm alle Primzahlen, die schon in der Liste sind, multipliziere sie, addiere 1 und füge den kleinsten Teiler des Resultats, der größer als eins ist, als neue Primzahl in die Liste ein, z.B.:

2
2+1=3, -> 3 kommt dazu
2*3+1 = 7 -> 7 kommt dazu
2*3*7+1= 43 -> 43 kommt dazu
2*3*7*43+1=1807 -> 13 kommt dazu
...

Demnach kann man eine unendliche Teilmenge (*) aller Primzahlen erzeugen, also muss die Menge aller Primzahlen ebenfalls unendlich sein - ich denke, das kann als direkter Beweis der Unendlichkeit der Primzahlenfolge gelten.

(*) Es wird ja nirgendwo behauptet, auf diese Weise wirklich alle Primzahlen zu "erwischen". Soweit ich weiß, ist die dahingehende Vermutung noch unbewiesen. Mehr zur erzeugten Folge 2,3,7,43,13... unter A000945 - OEIS
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zentriks Hilfe zu Sieb des Eratosthenes ohne boolean Java Basics - Anfänger-Themen 5
P Sieb des Eratosthenes Java Basics - Anfänger-Themen 9
S Hilfe bei "Sieb des Eratosthenes" mit Array & Markierung Java Basics - Anfänger-Themen 2
M Sieb des Eratosthenes für Anfänger Java Basics - Anfänger-Themen 10
I Sieb des Eratosthenes Java Basics - Anfänger-Themen 10
S Sieb des Eratosthenes Java Basics - Anfänger-Themen 5
P Sieb des Eratosthenes (bis 65536) Java Basics - Anfänger-Themen 8
H Sieb des Eratosthenes - Programmierfehler Java Basics - Anfänger-Themen 3
P BlueJ Sieb des Eratothenes Java Basics - Anfänger-Themen 4
T Erste Schritte Sieb des Eratothenes Java Basics - Anfänger-Themen 3
W Sieb des Erathostenes Java Basics - Anfänger-Themen 5
K need help doing Eratosthenes siev Java Basics - Anfänger-Themen 3
flatpat Variablen Eratosthenes mit Integer Array Java Basics - Anfänger-Themen 10
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
V JSON-Objs aus JSON-Obj filtern und löschen (Manipulation ohne Kenntnis der vollst. Struktur) Java Basics - Anfänger-Themen 12
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
P 2n Potenzieren ohne Math.pow oder pow Java Basics - Anfänger-Themen 8
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
R Buttons ohne Funktion Java Basics - Anfänger-Themen 2
JavaBeginner22 TextArea, ohne Zeilenumbruch? Java Basics - Anfänger-Themen 4
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
S Was macht ++ ohne Schleife? Java Basics - Anfänger-Themen 4
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
S Chars vergleichen ohne Betrachtung der Groß und Kleinschreibung Java Basics - Anfänger-Themen 7
javapingu Variablenwerte ändern ohne return Statement? Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
M for schleife ohne geschweifte Klammer Java Basics - Anfänger-Themen 15
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
L Zufälligen Zahlencode, ohne mehrfacher Verwendung einer Ziffer Java Basics - Anfänger-Themen 15
Sinan Arrays auflisten ohne Wiederholung Java Basics - Anfänger-Themen 28
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
S Teilen ohne Rest Java Basics - Anfänger-Themen 15
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
C Array-Werte werden gemischt, ohne Logik Java Basics - Anfänger-Themen 2
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
P Methode trim() ohne StringBuilder Java Basics - Anfänger-Themen 1
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
C Projekte in 2 versch. Arbeitsbereichen: auf ein Projekt verweisen (ohne Fehler zu bekommen) Java Basics - Anfänger-Themen 8
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
Z Methode zum Heraufinden von Anagrammen ohne Java API, Ausnahme String Java Basics - Anfänger-Themen 14
Z Attribut ändern ohne Kontrollstruktur Java Basics - Anfänger-Themen 2
R Boolean value ohne Kontrollstrukturen ändern Java Basics - Anfänger-Themen 5
C Wie habt Ihr angefangen mit der Java Programmierung, ohne Programmiervorkenntnisse Java Basics - Anfänger-Themen 8
S Klassenmethode ohne static Java Basics - Anfänger-Themen 2
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
M Bubblesort ohne Array Java Basics - Anfänger-Themen 30
J Array vertauschen ohne ein neues anzulegen?! Java Basics - Anfänger-Themen 10
F Hilfe - Wahrheitswert überprüfen ohne If Java Basics - Anfänger-Themen 2
ZH1896ZH Java-SemesterTest ohne Lösung :( Java Basics - Anfänger-Themen 47
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
C Teilbarkeit ohne "if" Java Basics - Anfänger-Themen 3
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
B Input/Output System.out.print mit und ohne "" Java Basics - Anfänger-Themen 5
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
F Buchstaben in einem String vertauschen (Ohne replace) Java Basics - Anfänger-Themen 10
R for schleife ohne klammer Java Basics - Anfänger-Themen 14
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
C Problem: PC ohne Internet und keine Möglichkeit Programme zu laden Java Basics - Anfänger-Themen 5
C unverständlicher Code Attribute ohne Datentyp, wie geht das? Java Basics - Anfänger-Themen 8
C Konstruktor mit und ohne Parameterliste Java Basics - Anfänger-Themen 13
B Potenzrechnung mit WindowBuilder ohne math.pow() Java Basics - Anfänger-Themen 1
Jackii ArrayList ausgabe ohne Dopplung Java Basics - Anfänger-Themen 11
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20
J Division ohne Arithmetische Funktion Java Basics - Anfänger-Themen 2
D .txt überschreiben mit BufferedWriter ohne reset Java Basics - Anfänger-Themen 6
H Cäsar chiffrierung ohne if-Anweisung Java Basics - Anfänger-Themen 5
A Input/Output System.out Ausgabe aktualisieren, ohne Konsole vollzuspamen Java Basics - Anfänger-Themen 2
B Potenzen ohne Math.pow Java Basics - Anfänger-Themen 4
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
M Liste ohne Duplikate Java Basics - Anfänger-Themen 8
S Rekursiver InsertionSort ohne Schleife Java Basics - Anfänger-Themen 7
4 Median ohne Array Rausbekommen Java Basics - Anfänger-Themen 8
L Auf Methoden einer Subklasse zugreifen ohne Typecast ? Java Basics - Anfänger-Themen 6
5 for-Schleife ohne 3 Angaben Java Basics - Anfänger-Themen 2
D Sortiertes Array mischen ohne Duplikat Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben