所谓质因数分解就是指将一个正整数n写成一个或多个质数的乘积的形式,例如6 = 2 * 3,8 = 2 * 2 * 2,180 = 2 * 2 * 3 * 3 * 5。写成指数的形式,例如6 = 2^1 * 3^1, 8 = 2^3, 180 = 2^2 * 3^2 * 5^1;
struct factor{
int x, cnt;//x为质因子,cnt为其个数
}fac[10];
考虑到2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29超过int范围,因为对一个fac数组的大小只需要开到10就可以了。
对一个正整数n来说只能存在一个大于等于sqrt(n)的质因子 ,所以分两步判断:1.先判断出小于sqrt(n)的质因子,再判断大于sqrt(n)的
#include <cstdio>
#include <math.h>
const int maxn = 100010;
int prime[maxn], pNum = 0;
int p[maxn] = {0};
void Find_prime(){
for(int i = 2; i< maxn; i++){
if(p[i] == false){
prime[pNum++] = i;
for(int j = i + i; j < maxn; j += i){
p[j] = true;
}
}
}
}
struct factor{
int x, cnt;//x为质因子,cnt为其个数
}fac[10];
int main(){
Find_prime();
int n, num = 0;//num为n的不同质因数的个数
scanf("%d", &n);
if(n == 1 ) printf("1 = 1"); //特判1的情况
else {
printf("%d=", n);
int sqr = (int)sqrt(1.0 * n);
//枚举根号n以内的质因子
for(int i = 0; i < pNum && prime[i] <= sqr; i++){
if(n % prime[i] == 0) {//如果prime[i]是n的因子
fac[num].x = prime[i];
fac[num].cnt = 0;
while(n % prime[i] == 0){//计算出质因子prime[i]的个数
fac[num].cnt++;
n /= prime[i];
}
num++; //不同质子个数+1
}
if(n == 1) break;//及时推出循环,节省时间
}
if(n != 1){//如果无法被根号n以内的质因子除尽
fac[num].x = n; //那么一定有一个大于根号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;
}