All pastes #815447 Raw Edit

Anonymous

public cpp v1 · immutable
·published 2007-12-14 02:01 UTC
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()