#include <iostream> #include <vector> #include <cmath> using namespace std; vector<int> primes; bool* vt=(bool*)malloc(sizeof(bool)*(2e5+1)); void getPrime(int n=(2e5)){ primes.push_back(2); for(int i=2;i<=n;i+=2){ vt[i]=true; } for(int i=3;i<=n;i+=2){ if(!vt[i]){ primes.push_back(i); vt[i]=false; } for(auto& prime:primes){ if(i*prime>n) break; vt[i*prime]=true; } } } int main() { int n; cin>>n; getPrime(); for(auto& prime:primes){ if(n==1) break; while(n%prime==0){ cout<<prime<<" "; n/=prime; } } if(n!=1) cout<<n; }
首先用埃氏素数筛法把小于sqrt(n)的素数全部筛选出来。因为n分解出的超过sqrt(n)的质因子数量最多一个,反证法:假设如果有两个a和b,那n>=a*b>sqrt(n)*sqrt(n)=n,得到n>n,显然是错误的,因此超出sqrt(n)的质因子最多一个。当我们遍历完所有小于sqrt(n)的素数后,n仍然没有被分解完,剩下的部分一定是素数,不需要判断直接输出即可。