题目描述
给出一个正整数,安装从小到大的顺序输出其分解为质因数的乘法算式。
format:N = p1^k1*p2^k2*···*pm^km,其中pi是质因数,ki是它的个数
输入
输入一个正整数n,可能是一个很大的数
输出
按如下样例格式输出
样例输入
180
样例输出
180 = 2^2*3^2*5
/*
质因子分解
180
180 = 2^2*3^2*5
97532468
97532468 = 2^2*11*17*101*1291
*/
#include<bits/stdc++.h>
using namespace std;
int n = 100001;
int prime[100001];
int num = 0;
bool p[100001];
struct f{ //用结构体存储质因子及个数
int x;
int cnt;
};
void find_prime(){
for(int i = 2; i <= n; i++){
if(!p[i]){
prime[num++] = i;
for(int j = i + i; j <= n; j = j + i){
p[j] = true;
}
}
}
}
int main(){
memset(prime, 0, sizeof(n));
memset(p, false, sizeof(n));
find_prime(); //质数数组初始化
struct f s[100001];
long long t, k = 0;
cin>>t;
long long res = t;
int sqr = sqrt(t);
for(int i = 0; i < n && prime[i] <= sqr; i++){
if(t % prime[i] == 0){
//1.已确定是自己的质因子
s[k].x = prime[i];
s[k].cnt = 0;
while(t % prime[i] == 0){ //2. 获取个数
s[k].cnt++;
t /= prime[i];
}
k++; //这里不要忘记
}
}
cout<<res<<" = "<<s[0].x;
if(s[0].cnt > 1){
cout<<'^'<<s[0].cnt;
}
for(int i = 1; i < k; i++){
cout<<'*'<<s[i].x;
if(s[i].cnt > 1){
cout<<'^'<<s[i].cnt;
}
}
return 0;
}