Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Primzahlsieb des Eratosthenes (Algorithmen)

Schreiben Sie ein Programm, das mittels des Primzahlsiebs des EratosthenesEratosthenes (um 276 v. Chr. - 195 v. Chr.) alle Primzahlen bis zu einer vorgegebenen Zahl (sagen wir 100) ermittelt.

Dazu wird zunächst ein Array mit Zahlen von 2 bis und mit 100 aufgefüllt. In diesem Fall ist der Array natürlich 99 Elemente groß.

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,  ..., 100.

In einem zweiten Schritt wird die nächste noch vorhandene Zahl gesucht (beginnend bei der Zahl 2), und alle Vielfachen davon werden gelöscht, indem sie auf 0 (Null) gesetzt werden. Der Array sieht also nach dem ersten Durchlauf (mit Zahl 2) wie folgt aus:

2, 3, 0, 5, 0, 7, 0, 9, 0, 11, 0, 13, 0, 15, 0, ....

Nach demselben Verfahren wird die nächste noch vorhandene Zahl (hier 3) gesucht und alle Vielfachen davon gelöscht (also auf Null gesetzt):

2, 3, 0, 5, 0, 7, 0, 0, 0, 11, 0, 13, 0, 0, 0, ....

Das geht so weiter, bis die Quadratwurzel der höchsten Zahl überschritten wurde. Im 3. Schritt werden die verbleibenden Zahlen auf dem Bildschirm ausgegeben. Das sind dann gerade alle Primzahlen bis zur vorgegebenen Zahl. Um den Algorithmus zu vereinfachen, schreiben Sie eine Hilfsfunktion, die die Vielfachen löscht:

vielfacheLoeschen(primzahl: integer)

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

5 Lösung(en)

import java.util.Scanner;

public class Eratosthenes {
    
  public static void main(String[] args) {
    new Eratosthenes().top();  }
    
  void top() {
    int   max        = eingabe("Max");
    int[] alleZahlen = init(max);
    sieben(alleZahlen);
    ausgabe(alleZahlen);  }
   
  void sieben(int[] alleZahlen) {
    int i = 0; 
    while(i < Math.sqrt(alleZahlen.length + 2)) { // sqrt = Quadratwurzel
        if(alleZahlen[i] > 0) {
        vielfacheLoeschen(alleZahlen, i);  }
      i = i + 1;  }    
  }

  void vielfacheLoeschen(int[] alleZahlen, int i) {
    int zahl = alleZahlen[i];
    int lIdx = i + zahl;
    while(lIdx < alleZahlen.length) {
      alleZahlen[lIdx] = 0;
      lIdx = lIdx + zahl;  }   
  }

  void ausgabe(int[] alleZahlen) {
    for(int z : alleZahlen) {
      if(z > 0) {
        System.out.println(z);  }
    }
  }

  int[] init(int max) {
    int[] arr = new int[max - 1];
    int i = 0;
    while( i < arr.length) {
      arr[i] = i + 2;
      i = i + 1;  }
    return arr;  }
   
  int eingabe(String string) {
    System.out.println(string + " :");
    Scanner sc = new Scanner(System.in);
    return sc.nextInt();  }

} // end class Eratosthenes
 
                
from math import sqrt
def eratosthenes(size):
    p=[]
    for i in range(2,size+1):
        p.append(i)
    z=2
    while z < sqrt(size):
        for t in p:
            if t>0:
                z=t
                break
   
        for k in p:
            if k%z==0:
                dump=p.remove(k)
        
    return p

print eratosthenes(10000)
                
public class Erasthotenes {
   public static void main(String[] args) {
     int n = 0; 
     try {
       n = Integer.parseInt(args[0]);
     } catch(Exception e) { }
     if(n < 2) n = 10000; 
     int[] p = new int[n+1]; 
     for(int i = 2; i <= n; i++) p[i] = i;
     for(int k = 2; k*k <= n; k++) 
       for(int i = 2*k; i <= n; i += k) 
         p[i] = 0; System.out.print("2");
     for(int i = 3; i <= n; i++)
       if(p[i] != 0)
         System.out.print(", " + i); System.out.println(); } }  	
                
function sieveOfEratosthenes(max) {
   var numbers = [], 
       primes = [],
       x = 2;
   
   for(x; x <= max; x++) numbers.push(x);
   
   while (numbers.length > 0) {
      primes.push(numbers.shift());
      for (x = 0; x <= numbers.length; x++)
         if (numbers[x] % primes[primes.length - 1] == 0) numbers.splice(x, 1);      
   }
   return primes;   
}

console.log(sieveOfEratosthenes(1000));
                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

// C++ 14 || VS-2022
#include <iostream>
#include <vector>
#include <algorithm>

std::vector<int> get_primes(int n) {
    std::vector<int> v{};
    for (size_t i{ 2 }; i < n; i++) v.push_back(i);
    auto q{ sqrt(n) };
    while (q--) {
        for (size_t i{ 0 }; i < v.size(); i++) {
            auto it{ std::remove_if(v.begin(), v.end(), [&i, &v](int k) { return (k != v[i] && k % v[i] == 0); }) };
            v.erase(it, v.end());
        }
    }
    return v;
}

void print(const std::vector<int>& v) {
    for (auto it{ v.begin() }; it != v.end() - 1; it++)
        std::cout << *it << ", ";
    std::cout << v.back() << "\n";
}

int main() {
    print(get_primes(100));
}
                

Lösung von: Jens Kelm (@JKooP)

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 1
Schwierigkeit: k.A.
Webcode: tmx9-wf4j
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen