#include <iostream> #include <cstdio> #include <cmath> using namespace std; const int N=1000005; int primes[N],cnt; bool st[N]; void get_primes(int n){//埃氏筛统计素数 for(int i=2;i<=n;i++){ if(!st[i]){ primes[cnt++]=i; for(int j=i*2;j<=n;j+=i) st[j]=true; } } } int main() { int n; scanf("%d",&n); get_primes(n); printf("%d\n",cnt); //for(int i=0;i<cnt;i++) cout<<primes[i]<<" "; return 0; }
#include <iostream> #include <cstdio> #include <cmath> using namespace std; const int N=1000005; int primes[N],cnt; bool st[N]; void get_primes(int n){//线性筛 for(int i=2;i<=n;i++){ if(!st[i]) primes[cnt++]=i; for(int j=0;primes[j]<=n/i;j++){ st[primes[j]*i]=true; if(i%primes[j]==0)break;//primes[j]一定是i的最小质因子 } } } int main() { int n; scanf("%d",&n); get_primes(n); printf("%d\n",cnt); //for(int i=0;i<cnt;i++) cout<<primes[i]<<" "; return 0; } /* n只会被最小质因子筛掉 1. i%primes[j]==0 primes[j]一定是i的最小质因子 primes[j]一定是primes[j]*i的最小质因子 2. i%primes[j]!=0 primes[j]一定小于i的所有质因子 primes[j]一定是primes[j]*i的最小质因子 对于一个合数x,假设primes[j]是x的最小质因子,当i枚举到x/primes[j]的时候这个合数会被筛掉 */