筛法求素数 + 遍历即可
//分解因数
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef long long LL;
const LL maxn = 1e6+5;
int primeNum[maxn];
bool isPrime[maxn];
void getPrime(int n)
{ //筛法求得n以内的所有素数并保存在primeNum中
for(int i = 2; i <= n; i++)
isPrime[i] = 1;
for(int i = 2; i <= n; i++){
if(isPrime[i])
for(int j = 2; i*j <= n; j++)
isPrime[i*j] = 0;
}
for(int i = 2, j = 1; i <= n; i++)
if(isPrime[i])
primeNum[j++] = i;
}
void solve(int n)
{ //每次求得并输出n的最小质因子
if(n == 1)
return;
for(int i = 1; primeNum[i] <= n; i++)
if(n % primeNum[i] == 0){
n /= primeNum[i];
if(n == 1)
printf(" %d", primeNum[i]);
else
printf(" %d *", primeNum[i]);
break;
}
solve(n);
}
int main()
{
getPrime(maxn);
int n;
while(cin >> n){
printf("%d =",n);
solve(n);
printf("\n");
}
return 0;
}