我们一起来看看这个问题吧!上个问题我们已经接触过整数分解了,那么你有没有一定的了解了吗?
题意:输出N的整数分解
有没有感觉比上一题简单多了,没有脑筋急转和,题意粗暴明了,唯一让人头疼的是,怎么输出呢?
需要注意的是,如果幂为1次,则不需要输入该幂!如果幂超过两次,则需要用括号单独包起来
#include <iostream>
#include <cmath>
using namespace std;
#define MAXI 20
struct yinshu
{
int di;
int mi;
};
struct Div
{
int xiangshu;
int xdi[MAXI];
int xmi[MAXI];
};
Div getpN(int m);
void vout(Div pN);
yinshu getOne(int yin,int& m);
int main()
{
int ncase,n,i;
cin>>ncase;
Div pN;
while(ncase--)
{
cin>>n;
pN=getpN(n);
cout<<n<<"=";
vout(pN);
}
return 0;
}
Div getpN(int m)
{
int i,j;
Div pans;
yinshu x;
if(m<2)
{
pans.xdi[0]=1;
pans.xmi[0]=0;
pans.xiangshu=0;
return pans;
}
int uplimit=(int)sqrt(m*1.0);
i=2;
j=0;
while(i<=uplimit)
{
if(m%i==0)
{
x=getOne(i,m);
pans.xdi[j]=x.di;
pans.xmi[j]=x.mi;
j++;
uplimit=(int)sqrt(1.0*m);
}
i++;
}
if(m>1)
{
pans.xdi[j]=m;
pans.xmi[j]=1;
j++;
}
pans.xiangshu=j;
return pans;
}
void vout(Div pN)
{
int i;
for(i=0;i<pN.xiangshu;i++)
{
if(pN.xmi[i]>1 && pN.xiangshu>1)
{
cout<<"("<<pN.xdi[i]<<"^"<<pN.xmi[i]<<")";
}
else if(pN.xmi[i]<=1)
{
cout<<pN.xdi[i];
}
else if(pN.xiangshu==1)
{
cout<<pN.xdi[i]<<"^"<<pN.xmi[i];
break;
}
if(i<pN.xiangshu-1)
{
cout<<"*";
}
}
cout<<endl;
}
yinshu getOne(int yin,int& m)
{
yinshu x;
x.di=yin;
x.mi=0;
while(m%yin==0)
{
x.mi++;
m/=yin;
}
return x;
}