筛质数
- 核心思想:筛法求质数
埃氏筛法:
- 每次用 2 3 4…. p-1 筛 2 - p之间的数
- 出现2 3 4 …的倍数时 去掉(4实际已经被去掉 不会用4去筛)
- 当2~p-1的数都没有筛掉p 说明p是质数
- 优化: 只用2~p-1中质数筛
线性筛法:
-
核心: n只会被其最小质因子筛掉
-
每一个合数都只会被筛一次,因为每个合数的最小质因数都是唯一的
-
#include<iostream>#include <algorithm>using namespace std;const int N = 1000010;int prime[N],cnt;bool st[N];void get_prime(int n){for(int i = 2;i<=n;i++){if(!st[i]) prime[cnt++] = i; //如果没被筛掉 记录成质数for(int j = 0;prime[j] <= n/i ; j ++) //从小到大遍历所有质数{st[prime[j] * i] = true; //将prime[j]的倍数筛掉if(i % prime[j] == 0) break; //如果i % prime[j] == 0 说明i是prime[j]的倍数//那么当prime[j+1]的时候 prime[j+1]*i的最小质因数是prime[j] 而不是prime[j+1]}}}int main(){int n;cin>>n;get_prime(n);cout<<cnt;}