题目
2的幂次方表示:
任何一个正整数都可以用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)
思路
对于求2进制的幂肯定立刻想到了快速幂的模板,可是咱们是多个相加,怎么进行递归求解呢?
答:可以找到本次幂与幂次方的幂之间的关系,因为每进入一次if(n%2==1)我们的幂次方恰好就多一,利用这个性质,我们就可以利用count进行计数,每次进入if时,count大小就是我们幂次方的大小。
代码
#include <bits/stdc++.h>
using namespace std;
string DFS(int n)
{
string str="";
int count=0;//计算次方数,以便递归,每次递归要清 0 的.
while(n!=0)
{
if(n%2==1)
{
if(count==0) str="2(0)+"+str;
else if(count==1) str="2+"+str;//这个else肯定要写,主要是影响下面一个
else str="2("+DFS(count)+")+"+str;//后运算的肯定写在前面的!
}
count++;
n/=2;
}
str.erase(str.size()-1);
return str;
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) cout<<0<<endl;
else cout<<DFS(n)<<endl;
}
}