思路很簡單,就是用n除以從2開始的數(把這個數設為i),如果除的盡,那么i就是n的一個質因數,
然后用n/=i,如果此時n<i那么直接結束循環,否則把i賦為2重復這一過程(每一次循環都能找出最小的那個質因數)
當然如過n是一個很大的質數,復雜度還是會退化到O(n)
所以我們每次都要判斷一下n是不是一個素數
代碼:
#include<bits/stdc++.h>
using namespace std;
bool is_prime(long long x){
if(x==1)
return false;
if(x==2||x==3)
return true;
if(x%6!=1&&x%6!=5)
return false;
int s=sqrt(x);
for(int i=5;i<=s;i+=6)
if(x%i==0||x%(i+2)==0)
return false;
return true;
}
vector<long long> pfc(long long n){//快速質因數分解
vector <long long> st;
long long i=0;
if(n==1)
{
st.push_back(1);
return st;
}
while(i<n)
{
if(is_prime(n)){
st.push_back(n);
return st;
}
for(i=2;i<n;i++)
{
if(n%i==0)
{
st.push_back(i);
n/=i;
break;
}
}
}
st.push_back(n);
return st;
}
