//质因子分解,输入一个int型正整数,输出其分解为质因数的乘法算式。
#include <stdio.h>
#include <math.h>
const int maxn = 100010;
bool is_prime(int n){
if(n==1) return false;
int sqr = (int)sqrt(1.0*n);
for(int i=2; i<sqr; i++){
if(n%i==0) return false;
}
return true;
}
int prime[maxn],pNum=0;
void Find_Prime(){
for(int i=1; i<maxn; i++){
if(is_prime(i)==true){
prime[pNum++]=i;
}
}
}
struct factor{
int x, cnt;//x为质因子,cnt为其个数
}fac[10];
int main(){
Find_Prime();
int n,num = 0;
scanf("%d",&n);
if(n==1) printf("1=1");
else{
printf("%d=",n);
int sqr = (int )sqrt(1.0*n);
for(int i=0; i<pNum&&prime[i]<=sqr;i++){
if(n%prime[i]==0){
fac[num].x=prime[i];
fac[num].cnt=0;
while(n%prime[i]==0){
fac[num].cnt++;
n/=prime[i];
}
num++;
}
if(n==1) break;
}
if(n!=1){
fac[num].x = n;
fac[num++].cnt=1;
}
for(int i=0; i<num; i++){
if(i>0) printf("*");
printf("%d",fac[i].x);
if(fac[i].cnt>1){
printf("^%d",fac[i].cnt);
}
}
}
return 0;
}
最后指出,如果要求一个正整数N的因子个数,只需要对其质因子进行分解,得到质因子pi的个数分别为e1,e2,...,ek,于是N的因子个数就是(e1+1)*(e2+1)*...*(ek+1)。原因是,对于每个质因子pi都可以选择其出现0次,1次,...,ei次,共ei+1种可能,组合起来就是答案。而由同样的原理可知,N的所有因子之和为(1+p1+p1^2+...+p1^e1)*(1+p2+p2^2+...+p2^e2)*...*(1+pk+pk^2+...+pk^ek)