boolis_prime(int x){if(x <2)returnfalse;for(int i =2; i <= x / i; i ++)if(x % i ==0)returnfalse;returntrue;}
(2)试除法——分解质因数(n中最多只包含一个大于sqrt(n)的质因子)
(时间复杂度O(logn)~O(sqrt(n))
voiddivide(int x){for(int i =2; i <= x / i; i ++)if(x % i ==0)//i 一定是质数{int s =0;while(x % i ==0) x /= i, s ++;
cout << i <<' '<< s << endl;}if(x >1) cout << x <<' '<<1<< endl;
cout << endl;}
朴素筛法求素数 (时间复杂度O(nloglogn))
int primes[N], cnt;// primes[]存储所有素数bool st[N];// st[x]存储x是否被筛掉voidget_primes(int n){for(int i =2; i <= n; i ++){if(st[i])continue;
primes[cnt ++]= i;for(int j = i + i; j <= n; j += i)
st[j]=true;}}
线性筛法求素数
int primes[N], cnt;// primes[]存储所有素数bool st[N];// st[x]存储x是否被筛掉voidget_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的最小质因子}}}
分析:
1.i%pj==0
pj一定是i的最小质因子,pj一定是pj*i的最小质因子
2.i%pj!= 0
pj一定小于i的所有质因子,pj也一定是pj*i的最小质因子
2、约数:
(1)试除法求一个数的所有约数
vector<int>get_divisors(int x){
vector<int> res;for(int i =1; i <= x / i; i ++)if(x % i ==0){
res.push_back(i);if(i != x / i) res.push_back(x / i);}sort(res.begin(), res.end());return res;}