6 solutions
-
1
#include<bits/stdc++.h> using namespace std; const int N=1e8+10; bool st[N],idx; vector<int> p; /* 1.标记的过程 如果i不是[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
- 153
- Accepted
- 22
- Uploaded By