Modernes C++ programmieren

Okt 23, 2024

lst-0525-godb.cpp

//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// https://godbolt.org/z/YMe5PY6aT 
#include <vector>
#include <numeric>   // iota
#include <iostream>
using std::vector; using std::cout;
struct Zahl {        // stellvertretend für ein großes, teures Objekt
    unsigned long val_;
    Zahl(unsigned long val) : val_{val} {}
    Zahl() : val_{0} {}
};
/* ermittelt anhand bisheriger Primzahlen, ob z eine Primzahl ist */
bool isPrim(const Zahl& z, const vector<Zahl*> prims) {
    for(Zahl* p : prims) {
        if((p->val_*p->val_) > z.val_) return true;   // zu groß
        if(z.val_ % p->val_ == 0) return false;       // ist Teiler
    }
    return true;
}
int main() {
    vector<Zahl> alleZahlen(98);   // 98 mit null initialisierte Elemente
    std::iota(begin(alleZahlen), end(alleZahlen), 3); // 3..100
    /* alleZahlen enthält jetzt {3..100} */
    vector<Zahl*> prims{};         // bekommt ermittelte Primzahlen
    Zahl zwei{2};
    prims.push_back(&zwei);        // die 2 wird gebraucht
    for(Zahl &z : alleZahlen) {    // über alle Zahlen iterieren
        if(isPrim(z, prims)) {
            prims.push_back( &z ); // speichere Adresse
        }
    }
    /* Rest ausgeben */
    for(Zahl* p : prims)
        cout << p->val_ << " ";
    cout << "\n";
}