rendered paste body#include <iostream>#include <vector>#include <iomanip> // setw()using namespace std;#define classdef typedefnamespace{ classdef vector <unsigned> CVUInt; typedef CVUInt::size_type Ind_t; void AffichVect (const CVUInt & Tab) { Ind_t Nb = 10; for (Ind_t i = 0; i < Tab.size(); ++i) { cout << setw (5) << Tab [i]; if (0 == --Nb) { cout << '\n'; Nb = 10; } } if (Nb > 0) cout << '\n'; } // AffichVect() void GenerPrimesInfEqN (CVUInt & LesPremiers, unsigned N) { LesPremiers.clear(); LesPremiers.reserve ((N + 1) / 2); LesPremiers.push_back (2); for (unsigned i (3); i <= N; i += 2) LesPremiers.push_back (i); for (Ind_t i (1); LesPremiers [i] * LesPremiers [i] <= N; ++i) { if (0 == LesPremiers [i]) continue; // Supprimer les multiples de LesPremiers [i] const Ind_t CstIncr = LesPremiers [i]; const Ind_t CstSz = LesPremiers.size(); for (Ind_t j = i + CstIncr; j < CstSz; j += CstIncr) LesPremiers [j] = 0; } // Compactage unsigned NbPremiers = 0; for (Ind_t i (0); i < LesPremiers.size(); ++i) if (LesPremiers [i] > 0) LesPremiers [NbPremiers++] = LesPremiers [i]; LesPremiers.resize (NbPremiers); } // GenerPrimesInfEqN() void GenerNPrimes (CVUInt & LesPremiers, unsigned NbPremiersMax) { LesPremiers.clear (); if (0 == NbPremiersMax) return; const unsigned CstSzTab = 100; GenerPrimesInfEqN (LesPremiers, CstSzTab); if (LesPremiers.size() >= NbPremiersMax) { LesPremiers.resize (NbPremiersMax); return; } LesPremiers.reserve (NbPremiersMax); unsigned TabUInt [CstSzTab]; // Int : premier entier impair non contenu dans le tableau unsigned Int (CstSzTab + 1); for ( ; LesPremiers.size() < NbPremiersMax; ) { unsigned ValDep (Int); for (unsigned i (0); i < CstSzTab; ++i, Int += 2) TabUInt [i] = Int; // Suppression des multiples des nombres premiers déjà // trouvés // Les multiples de 2 ne doivent pas être supprimés for (Ind_t j (1); j < LesPremiers.size(); ++j) { // Suppression des multiples de LesPremiers [j] // Premier multiple impair de LesPremiers [j] >= ValDep unsigned & Prime = LesPremiers [j]; unsigned Mult = (ValDep - 1 + Prime) / Prime * Prime; if (Mult % 2 == 0) Mult += Prime; // Rang du prochain multiple IMPAIR unsigned Rg = (Mult - ValDep) / 2; for (; Rg < CstSzTab; Rg += Prime) TabUInt [Rg] = 0; } // Récupération des nombres premiers restants for (unsigned i (0); LesPremiers.size() < NbPremiersMax && i < CstSzTab; ++i) if (TabUInt [i] > 0) LesPremiers.push_back (TabUInt [i]); } } // GenerNPrimes()