题目描述
任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+20
同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7=22+2+20(21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210+28+25+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
#include<iostream>
using namespace std;
void judge( int n ) //返回最大项是2的多少次幂
{
//结尾可能是2或者1 若为2 直接输出2 若为1 直接输出2(0) 且最后不需要任何符号
if(n==1){
cout<<2<<"("<<0<<")";
}
else if(n==2){
cout<<2;
}
//若直接n已经为零了 就不需要再进行任何输出直接返回
else if(n==0){
return ;
}
else{
int i,j;
for(i=1;i<=14;i++){ //i为2的多少次幂
int sum = 2;
for(j=2;j<=i;j++){
sum*=2;
}
if((n-sum)>=0&&(n-sum)<sum)
{
n=n-sum; //n的值 可能为0
//若为2次幂可直接输出 因为零次幂已经在上面输出了
if(i==2)
{
cout<<2<<"("<<i<<")";
//如果n不为0 即后面还有项 要输出加号
if(n!=0)
cout<<"+";
}
else if(i == 1)
{
cout<<2;
//和上面一样 如果n不为0 即后面还有项 要输出加号
if(n!=0)
cout<<"+";
}
else
{
cout<<2<<"(";
judge(i); //将i也输出成上面的模样 小到2时结束
cout<<")";
//和上面一样 如果n不为0 即后面还有项 要输出加号
if(n!=0)
cout<<"+";
}
judge(n);
}
}
}
}
int main()
{
int a;
scanf("%d",&a);
judge(a);
return 0;
}