#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仍然没有被分解完,剩下的部分一定是素数,不需要判断直接输出即可。

京公网安备 11010502036488号