【题目描述】
任何一个正整数都可以用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)
【输入】
一个正整数n(n≤20000)。
【输出】
一行,符合约定的n的0,2表示(在表示中不能有空格)。
【输入样例】
137
【输出样例】
2(2(2)+2+2(0))+2(2+2(0))+2(0)
题目分析
此题目其实就是分解数字,比如7
我们每次的递归都是取2的i次幂<=7,且2的i+1次幂>7。然后处理输出,然后递归7-2
的i次方,也就是剩余的数即可。
处理输出的时候要注意,次幂1的处理与剩余1(如3-2=1的1)的处理,要区分。
具体见代码。
代码
#include<bits/stdc++.h>
using namespace std;
void dig(int a){
if(a==2){
cout<<"2";
return ;
}
else if(a==0){
cout<<"0";
return ;
}
else{
int k=1;
while(pow(2,k)<=a){
k++;
}
if(k-1==1){
cout<<"2";
}
else{
cout<<"2(";
dig(k-1);
cout<<")";
}
if((a-pow(2,k-1))!=0){
cout<<"+";
dig(a-pow(2,k-1));
}
}
}
int main(){
int n;
cin>>n;
dig(n);
return 0;
}