详细见:http://blog.csdn.net/nk_test/article/details/46242401
#include<bits/stdc++.h> using namespace std; const int maxn = 1e7; bool vis[maxn]; int prime[maxn]; int f(int n)//计算从1到n的素数个数 { int cnt =0; memset(vis,0,sizeof(vis)); for(int i=2;i<=n;i++) { if(!vis[i]) prime[cnt++] = i; for(int j=0;j<cnt && i*prime[j]<=n;j++) { vis[i*prime[j]]=1; if(i%prime[j]==0) break; } } return cnt; } /*当 i 能整除 prime[j] 那么 i*prime[j+1] 这个合数肯定被 prime[j] 乘以某个数筛掉。 因为i中含有prime[j], prime[j] 比 prime[j+1] 小。*/ int main () { int n;cin>>n; cout<<f(n)<<endl; return 0; }