前言
正文
参考题解
#include<iostream>
#include<cmath>
using namespace std;
/* 题意: 给定一个数n,将其分解成为质因子的乘法形式(从小到大) 思路:直接套用质因子分解模板即可。注意首先打印出素数表,然后再 进行质因子分解 注意点: 1、素数的判断时循环条件是小于等于根号n 2、打印素数表时,从1开始循环,并且循环条件是小于maxn 3、注意特判1 4、注意枚举质因子时如何求每个质因子的个数,以及n是变化的,故注意不能再循环条件中求sqrt(n) */
const int maxn=1e5+10;//素数表长,因为题目n不超过int,故sqrt(n)不超过1e5
int prime[maxn],pNum=0;//prime数组存放所有的素数,pNum表示素数的个数
bool p[maxn]={false};//p[i]==true表示i是素数
//判断n是否是素数
bool isPrime(int n){
if(n<=1)return false;
for(int i=2,j=(int)sqrt(n*1.0);i<=j;i++){
if(n%i==0)return false;
}
return true;
}
//打印素数表 ,注意从1开始,小于maxn
void findPrime(){
for(int i=1;i<maxn;i++){
if(isPrime(i)){
prime[pNum++]=i;
p[i]=true;//i是素数
}
}
}
struct factor{
int x,cnt;//x表示质因子,cnt表示其个数
}fact[10];//长度为10即可,因为2*35*7*...*29已经超过了int型范围
int main(){
findPrime();//打印素数表
int n,num=0;//num表示不同质因子的个数
cin>>n;
if(n==1){//特判1
cout<<"1=1\n";
}else{
cout<<n<<"=";
//枚举根号n以内的质因数
for(int i=0,j=(int)sqrt(n*1.0);i<pNum&&prime[i]<=j;i++){//分解质因子
if(n%prime[i]==0){
fact[num].x=prime[i];
fact[num].cnt=0;
while(n%prime[i]==0){//求质因数prime[i]的个数
fact[num].cnt++;
n/=prime[i];
}
num++;
}
if(n==1)break;
}
if(n!=1){//说明n无法被根号n以内的质因子除尽,故必有大于根号n的质因子
fact[num].x=n;
fact[num].cnt=1;
num++;
}
//输出
for(int i=0;i<num;i++){
if(i!=0)cout<<"*";
cout<<fact[i].x;
if(fact[i].cnt>1){
cout<<"^"<<fact[i].cnt;
}
}
}
return 0;
}