埃氏筛法
欧拉筛法:https://blog.csdn.net/Losk_0/article/details/87884390
#include <cstdio> #include <iostream> #include <cmath> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int maxn = 10010; vector<int> prime; //如果i为素数,则IsPrime[i]为false;否则,IsPrime[i]为true bool IsPrime[maxn]; int num = 0; // 埃氏筛法 void Find_Prime1() { memset(IsPrime, true, sizeof(IsPrime)); for (int i = 2; i < maxn; i++) { if (IsPrime[i]) //如果i为素数 { if (i % 10 == 1) { prime.push_back(i); } for (int j = i * i; j < maxn; j += i) { IsPrime[j] = false; } } } } // 欧拉筛法 void Find_Prime2(){ for(int i = 2; i < maxn; i++){ if(!IsPrime[i]){ prime.push_back(i); } for(int j = 0; j < prime.size() && i * prime[j] < maxn; j++){ IsPrime[i * prime[j]] = true; if(i % prime[j] == 0){ break; } } } } int main() { int n; Find_Prime1(); while (~scanf("%d", &n)) { //从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字 int pos = lower_bound(prime.begin(), prime.end(), n) - prime.begin(); if (pos == 0) { printf("-1"); continue; } for (int i = 0; i < pos; i++) { i == 0 ? printf("%d", prime[i]) : printf(" %d", prime[i]); } } return 0; }