埃氏筛素数
埃氏筛:非常接近线性,仅次于线性筛,主要是很好打。。。
题目:给定一个正整数 n ,询问 1~n 内有多少素数。
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<cstdlib> #include<stack> #include<vector> #include<queue> #include<deque> #include<map> #include<set> using namespace std; #define lck_max(a,b) ((a)>(b)?(a):(b)) #define lck_min(a,b) ((a)<(b)?(a):(b)) typedef long long LL; const int maxn = 1e7+7; LL n,ans; bool not_pri[maxn]; inline LL read() { LL kr=1,xs=0; char ls; ls=getchar(); while(!isdigit(ls)) { if(!(ls^45)) kr=-1; ls=getchar(); } while(isdigit(ls)) { xs=(xs<<1)+(xs<<3)+(ls^48); ls=getchar(); } return xs*kr; } inline void out(LL xs) { if(!xs) {putchar(48); return;} if(xs<0) putchar('-'),xs=-xs; int kr[57],ls=0; while(xs) kr[++ls]=xs%10,xs/=10; while(ls) putchar(kr[ls]+48),ls--; } inline void deal_first() { for(LL i=2;i<=n;i++) { if(not_pri[i]) continue; ans++; for(LL j=i*2;j<=n;j+=i) not_pri[j]=true; } } int main() { n=read(); deal_first(); out(ans),putchar('\n'); return 0; }