题目描述
任何一个正整数都可以用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;
}