一、试除法判定质数
讲解:AcWing 866. 试除法判定质数 - AcWing
·<=1的数既不是质数,也不是合数
·>1的整数中,如果只包含1和本身这两个约数,则称为质数或者素数
·质数的判定方法:试除法
·判断是否为质数:1、判断是否>1 2、判断是否只有1和本身两个因数
·枚举的时候,只要枚举[2,根号n]
bool is_prime(int n) { if(n<2) return false; for(int i=2;i<=n/i;i++) { if(n%i==0) return false; } return true; }
·判断条件的建议:
1、不要写成i<=sqrt(n)
因为每执行一次判断,都要执行一遍sqrt,这个函数计算很慢
2、不要写成i*i<=n
因为当i很大时候,可能存在溢出风险,会影响小于等于的判断
二、试除法分解质因数
分析:
·把一个合数分解质因数
·分解质因数:
写成合数=质因数1^a1 * 质因数2^a2········质因数k^ak
上式要求ak是质数,但下述算法中,我们枚举的并不是质数,枚举的是2到n的所有数
但是是没问题的
·能否进一步优化:
由于n中最多包含一个大于根号n的质因子,否则两个大于根号n的质因子相乘一定大于n
所以可以先枚举2到根号n
如果最后除干净后,n>1,那么说明这个n就是那个大于根号n的质因子
void divide(int n) { for(int i=2;i<=n/i;i++) { if(n%i==0) { int s=0; while(n%i==0) { n/=i; //除干净! s++ } printf("%d %d\n",i,s); } } if(n>1) printf("%d %d\n",n,1); }