思路很簡單,就是用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; }