题目描述
任何一个正整数可以用2的幂次方表示。例如137 = 27+23+20
同时约定次方用括号表示,即ab可表示为a(b)
由此可知137可以表示成2(7)+2(3)+2(0)
同理,数字7,3还可以继续这样表示下去。
最终137=2(2(2)+2+2(0))+2(2+2(0))+2(0)
输入格式
输入存在多组测试数据,每组测试数据输入一行包含一个正整数表示n(n<=20000)
输出格式
对于每组测试数据输出一行表示答案。
输入样例
137
1315
输出样例
2(2(2)+2+2(0))+2(2+2(0))+2(0)
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
分类标签
基础题 递归
C++代码
#include<iostream>
#include<cstring>
using namespace std;
int b(int in[],int n)
{
int i=0;
while(n)
{
in[i++] = n%2;
n /= 2;
}
return i-1;
}
void dfs(int n)
{
int in[20];
int tem = b(in,n);
if( n==0 )
{
cout<<0;
}
else for( int i=tem;i>=0;i-- )//对于一个不为0的数进行分解
{
if( in[i]&&i!=1 )//不存在2 即不存在诸如+2+这样的情况 与下面的区别在于有"()"
{
cout<<2<<"(";
dfs(i);
cout<<")";
for( int j=i-1;j>=0;j-- )
{
if(in[j])
{
cout<<"+";
break;
}
}
}
else if( in[i]&&i==1 )//存在2 即存在诸如+2+这样的情况 与上面的区别在于无"()"
{
cout<<2;
if( in[i-1]==1 )
cout<<"+";
}
}
}
int main()
{
int n;//n<=20,000
while( cin>>n )
{
dfs(n);
cout<<endl;
}
return 0;
}