Sieb des Eratosthenes

Hi, ich habe versucht das Sieb_des_Eratosthenes zu schreiben aber habe irgendwie einen kleinen Denkfehler in mein Programm eingebaut. Könnte jemand mal raufschauen und mir nen Tipp geben?

Die Idee ist das am Anfang jeder Boolean im Array als Kandidat gesehen wird und dann erstmal aussortiert wird. Am Ende sollen dann alle “wahren” Kandidaten ausgegeben werden, allerdings wird mir dann einfach jede Zahl von 2-länge des Arrays ausgegeben.


public class Prime {

	public static void main(final String[] args) {

		Scanner in = new Scanner(System.in);
		System.out
				.println("Geben Sie eine ganze Zahl ein, die größer als 1 ist. ");
		int m;
		m = in.nextInt();
		boolean[] kandidat = new boolean[m];
		int x = 2;
		int position = 2;
		kandidat[0] = false;
		kandidat[1] = false;

		for (int i = 2; i < m - 1; i++) {
			kandidat** = true;
		}

		for (int i = 2; i <= m - 1; i++) {
			for (int i2 = 2; i * position <= 50 - 1; i++) {
				kandidat[i2 * position] = false;

			}

		}

		for (int i = 2; i <= kandidat.length - 1; i++) {
			if (kandidat** = true) {
				System.out.println(i);
			}
		}

	}

}```

Das Sieb des Eratosthenes ist sicherlich haufenweise im Internet zu finden.
Wenn du hier Code postest, dann wäre es gut, wenn du Java-Tags verwendest, benutze dazu notfalls den erweiterten Modus.

Beispiel

public class PrimeJava {
	// Sieb des Eratosthenes 
	 
    public static void main(String[] args) {
        
          int n = args.length==1 ? 100: Integer.parseInt(args [0]); //Liest Wert ein
          // Eratosthenes
          int z=n-1;
          boolean[] gestrichen = new boolean[z];
          for (int i = 2; i <= n; i++) {
          	gestrichen[i-2] = false;
          }
          int q = (int) Math.sqrt(n);
          for(int i=2; i <= q; i++) {
              if (!gestrichen[i-2]) {
                for (int j = i*i; j <= n; j+=i){
                	if (!gestrichen[j-2]){
                		gestrichen[j-2] = true;
                		z--;
                	}
                }
              }
          }

          int[] primzahlen = new int[z];
          System.out.printf("%d Primzahlen bis %d:%n",z,n);
          z=0;
          for(int i=2; i <= n; i++) {
              if (!gestrichen[i-2]) {
              	primzahlen[z]=i;         	
                z++;
            	System.out.printf("%20d",i);
            	if (z%5 == 0) System.out.println();
              }
          }
}

hier mal dein Code


	public static void main(String []args){

		Scanner in = new Scanner(System.in);
		System.out.println("Geben Sie eine ganze Zahl ein, die größer als 1 ist. ");
		int m;
		m = in.nextInt();
		boolean []kandidat = new boolean  [m]  ;
		int x=2;
		int position=2;
		kandidat[0]=false;
		kandidat[1]=false;


		for (int i =2; i<m-1; i++){
			kandidat**=true;
		}

		for ( int i=2; i<= m-1; i++) { 	  
			for(int i2=2;  i*position<=50-1;i++){
				kandidat[i2*position]=false;

			}

		}

		for (int i=2;i<=kandidat.length-1;i++)  {
			if(kandidat**=true){
				System.out.println(i);}
		}
	}
}```

Lass dich nicht entmutigen, ich hatte dazu vor kurzem mal eine Klasse geschrieben:


    public SdE() {
        boolean[] sieb = sde((int) Math.ceil(Math.sqrt(Integer.MAX_VALUE)) + 1);
        int j = 0;
        for (boolean b : sieb) {
            if (b) {
                j++;
            }
        }
        this.sieb = new int[j];
        j = 0;
        for (int i = 0; i < sieb.length; i++) {
            if (sieb**) {
                this.sieb[j++] = i;
            }
        }
    }

    private boolean[] sde(final int n) {
        boolean[] sieb = new boolean[n];
        sieb[2] = true;
        for (int i = 3; i < n; i += 2) {
            sieb** = true;
        }
        final int sqrt = (int) Math.sqrt(n) + 1;
        for (int i = 3; i < sqrt; i += 2) {
            if (sieb**) {
                int j = i + i;
                while (j < n) {
                    sieb[j] = false;
                    j += i;
                }
            }
        }
        return sieb;
    }```

Sicherlich Ausbesserungsarbeit.

Erstelle ein Sieb (boolean[]), alles false,
setze 2 auf true,
setze 3 und Vielfache von 3 (voerst) auf true,
gehe von 3 in Schritten 2, falls es sich um eine Primzahl handelt,
setze Vielfach davon auf false.

nehmen wir deinen code doch mal zeile für zeile auseinander


	public static void main(final String[] args) {

		Scanner in = new Scanner(System.in);
		System.out
				.println("Geben Sie eine ganze Zahl ein, die größer als 1 ist. ");
		int m;
		m = in.nextInt();
		boolean[] kandidat = new boolean[m];
		int x = 2;
		int position = 2;
		kandidat[0] = false;
		kandidat[1] = false;

		for (int i = 2; i < m - 1; i++) {
			kandidat** = true;
		}

		for (int i = 2; i <= m - 1; i++) {
			for (int i2 = 2; i * position <= 50 - 1; i++) {
				kandidat[i2 * position] = false;

			}

		}

		for (int i = 2; i <= kandidat.length - 1; i++) {
			if (kandidat** = true) {
				System.out.println(i);
			}
		}

	}

}```



zeile 8-9 : erst deklarieren und dann zuweisen ?
geht auch in einer zeile : int m=in.nextInt();

zeile 10 : bool-array der größe m anlegen, default werte false

zeile 13-14 : array-index 0 und 1 auf false setzen > wie gesagt, default eines bool ist false > kann raus

zeile 15ff : for-loop : alle werte auf true setzen
soweit richtig, denn beim sieb geht man erstmal von aus das alle zahlen prim sind, und diese werden dann der reihe nach weggestrichen

zeile 19ff : geschachtelter for-loop der bitte genau WAS macht ?
der äußere loop ist klar : normaler iterations-loop übers array
der innere loop macht aber völligen murks
du fängst bei i2=2 an und gehst so lange i*2<=50-1 ist und erhöst bei jedem loop i um 1

erstens : <=x-1 kann man auch direkt als <x schreiben
zweitens : du machst mit i2 überhaupt nichts

was passiert also ? richtig : nichts
denn es wird immer nur gerechnet i2*position, und das bleibt grundsätzlich 2*2 = 4
es ändert sich nicht weshalb sich auch im array nichts ändert

hast du dir überhaupt irgendwas bei diesen zeilen gedacht ? wenn ja würde ich gerne mal die erklärung hören


und am ende machst du in zeile 28 den anfängerfehler schlecht hin : "=" ist eine ZUWEISUNG ... der VERGLEICH wäre "==", wobei man NIE auf "==true" prüft sondern NUR "if(x)" schreibt


der code ist also irgendwie kompletter müll

und deinen fehler kann ich dir sagen : du hast überhaupt keine ahnung von dem was du da gemacht hast bzw überhaupt machen sollst

Ich hätte da auch noch ein Sieb:


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class SieveOfEratosthanes {

    private Boolean[] primes;

    public void sieve(int max) {
        primes = new Boolean[max];
        initPrimes();
        for (int candidate = 2; candidate < primes.length; ++candidate) {
            if (primes[candidate]) {
                removesMultiples(candidate);
            }
        }
    }

    private void initPrimes() {
        for (int index=0; index<primes.length; ++index) {
            primes[index] = true;
        }
        if (primes.length > 1) {
            primes[0] = false;
            primes[1] = false;
        }
    }

    private void removesMultiples(int candidate) {
        int remove = candidate * candidate;
        while (remove < primes.length) {
            primes[remove] = false;
            remove += candidate;
        }
    }

    public List<Integer> getPrimes() {
        List<Integer> primeNumbers = new ArrayList<>();
        for (int candidate = 0; candidate < primes.length; ++candidate) {
            if (primes[candidate]) {
                primeNumbers.add(candidate);
            }
        }
        return primeNumbers;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Geben Sie eine ganze Zahl ein, bis zu der die "
                + "Primzahlen berechnet werden sollen "
                + "(und die größer als 1 ist):");
        int until = in.nextInt();
        in.close();
        if (until > 1) {
            SieveOfEratosthanes sieve = new SieveOfEratosthanes();
            sieve.sieve(until);
            for (Integer prime : sieve.getPrimes()) {
                System.out.println("Primzahl gefunden: " + prime);
            }
        }
        else {
            System.out.println("Die Zahl war zu klein.");
        }
    }

}