1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
/** remplis le tableau donné en paramètre avec TOUTES les valeurs comprise dans l'intervalle donné
*/
void fillValues(std::vector<int> & toFill, int limit){
// évite que le tableau ne doive être redimentioné trop souvent
toFill.reserve(limit+1);
/*faisons simple, chaque nombre prend la position qui correspond à sa valeur dans le tableau */
for(int i = 0;i<=limit;++i){
toFill.push_back(i);
}
}
/** invalide les multiples d'une valeur donnée */
void invalidateNonPrimes(std::vector<int> & toCheck, int value){
int multiplier = 2;
while(value * multiplier <= toCheck.size()){
toCheck[value * multiplier] = 0;
++multiplier;
}
}
void checkForPrimes(std::vector<int> & toCheck){
for(auto value : toCheck){
// il ne sert à rien ni de tester 1, ni de tester 0, ni les valeurs invalidées
if(value <1)
invalidateNonPrimes(toCheck, value);
}
}
int main(){
std::cout << "Jusqu'à quel entier N voulez-vous calculer les nombres premiers? ";
long long limit{0};
std::cin >> limit;
// le tableau des valeurs
std::vector<int> values;
// on le remplit
fillValues(values, limit);
// on invalide les valeurs qui ne sont pas des nombres premiers
checkForPrimes(values);
// on supprime les valeurs invalides
values.erase(std::remove_if(values.begin(),values.end(),[](int i){return i == 0;}));
/*
for(auto it : value){
std::cout<<it<< "est un nombre premier\n";
}
*/
return 0;
} |
Partager