//质因子分解,里面涉及到了前面的素数判断
#include <iostream>
#include <math.h>
using namespace std;
const int maxn=100010;
int prime[maxn],pNum=0;
//pNum:记录的位置索引上的素数
//素数判断
bool isPrime(int n){
if(n<=1) return false;
for(int i=2;i<=(int)sqrt(1.0*n);i++){
if(n%i==0) return false;
}
return true;
}
//记录素数,素数放到里面,然后根据索引找到索引所对应的素数
void find_Prime(){
for(int i=1;i<maxn;i++){
if(isPrime(i)==true){
//记录数组下表从零开始,然后记录素数的顺序
prime[pNum++]=i;
}
}
}
//记录每个质因子,并且记录质因子出现的次数。
//开辟质因子数组,其实可以证明只要结构数组开辟到10就可以了
struct factor{
int x;//从小到大记录质因子
int time;//记录质因数出现的次数
}fac[10];
//比如:9进行质因子分解,为3*3.那么x=3,time=2
int main(){
find_Prime();//务必要写,从一开始就把质因子的表的做好。算是缓存的作用
int n,num=0;
cin>>n;
if(n==1) cout<<"1=1";
else{
printf("%d=",n);
for(int i=0;i<pNum&&prime[i]<=(int)sqrt(1.0*n);i++){
//说明能够除得尽,开始去记录质因子
if(n%prime[i]==0){
fac[num].x=prime[i];
fac[num].time=0;
while(n%prime[i]==0){
fac[num].time++;
n/=prime[i];
}
num++;
}
if(n==1) break;
}
if(n!=1){
fac[num].x=n;
fac[num++].time=1;
}
for(int i=0;i<num;i++){
if(i>0) cout<<"*";
cout<<fac[i].x;
if(fac[i].time>1) printf("^%d",fac[i].time);
}
}
return 0;
}
考察数论(素数和质因子),其实的知识讲解,请参考(写了一大半,呜呜呜,先留一个空,后面完整补上)