7 solutions
-
1
#include<bits/stdc++.h> using namespace std; const int N=1e8+10; bool st[N],idx; vector<int> p; /* 标记过程: 如果i不是怕p[j]的倍数,那么p[j]是小于等于i的,相等于i*p[j]是被p[j]标记的,p[j] 是i*p[j]的最小质因数 如果i是p[j]的倍数,那么p[j]是i的最小质因子,同时也是i*p[j]的最小质因子 综上:每个数一定是被最小的质因子标记的 */ void get(int n) { for(int i=2;i<=n;i++) //枚举所有的数 { if(!st[i]) { p.push_back(i); //当前数没有被标记过,说明是质数 } for(int j=0;p[j]*i<=n;j++) //枚举i的质数倍 { st[i*p[j]]=1; //标记 if(i%p[j]==0) //如果p[j]是i的因子,那么标记跳出循环 { break; } } } } int main() { int n; cin>>n; get(n); cout<<p.size(); return 0; }
Information
- ID
- 181
- Time
- 2000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- (None)
- # Submissions
- 172
- Accepted
- 28
- Uploaded By