http://ac.jobdu.com/problem.php?pid=10952的幂次方
//手动模拟
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main(void)
{
int j,n,flag,m;
int binary[15]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384};
string str[20001];
str[1]="2(0)";
str[2]="2";
for(n=3;n<20001;n++)
{
flag=0,m=n;
for(j=14;j>=0;j--)
{
if(binary[j]>n)
continue;
else if(binary[j]==n)
{
str[n]+="2(";
str[n]+=str[j];
str[n]+=")";
break;
}
else
{
if(m>=binary[j])
{
m-=binary[j];
if(flag)
str[n]+="+";
str[n]+=str[binary[j]];
flag=1;
}
}
}
}
while(scanf("%d",&n)!=EOF)
{
cout<<str[n]<<endl;
}
return 0;
}
方法二:
//递归
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
void dfs(int n)
{
int i=0,binary[15];
bool add;
if(n==0)
{
printf("0");
return ;
}
else if(n==1)
{
printf("2");
return ;
}
while(n)
{
if(n&1)
binary[i++]=1;
else
binary[i++]=0;
n>>=1;
}
add=false,i--;
for(;i>=0;i--)
{
if(binary[i])
{
if(add)
printf("+");
if(i>=2)
{
printf("2(");
dfs(i);
printf(")");
}
else if(i==1)
printf("2");
else if(i==0)
printf("2(0)");
add=true;
}
}
}
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF)
{
dfs(n);
printf("\n");
}
return 0;
}