素因子的定义:对于一个数n来说,将它的因子拆到若干个素数相乘,这些素数被称为n的素因子。
比如 12可以被拆为2 6
6不是质数,可以继续拆为2*3
所以最后12的素因子就是 2, 3(不计重复元素)
-------------------------------------------------分割线---------------------------------------
前言
那么一般菜鸡(我)写求素因子的算法时常常从i=2到sqrt(n*1.0)枚举,然后不停的拆分,时间复杂度为O(nlogn)(有些人甚至想也不想,直接从2枚举到n。。。orz)
然而, Vishwas Garg提供了一种更为高效(logN)的求一个数所有素因子的方法.
具体步骤
- 除以所有以 2 为倍数的因子
- 枚举以 i 为倍数为因子的整数, 此时 i 肯定为奇数.
- 防止 n 本身是个素数
#include<iostream>
#include<cmath>
using namespace std;
void primeFactor(int n){
//求解n的素因数
while(n%2==0){
cout<<2<<" ";
n/=2;
}
for(int i=3;i<=sqrt(n*1.0);i+=2){
while(n%i==0){
cout<<i<<" ";
n/=i;
}
}
if(n>2){
cout<<n;
}
cout<<endl;
}
int main(){
int n;
cin>>n;
primeFactor(n);
return 0;
}