题目描述
任何一个正整数都可以用2的幂次方表示。例如
137=2^7+2^3+2^0
同时约定方次用括号来表示,即a^b 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 2^2+2+2^0 (21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2^10 +2^8 +2^5 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
137=2^7+2^3+2^0
同时约定方次用括号来表示,即a^b 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 2^2+2+2^0 (21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2^10 +2^8 +2^5 +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表示(在表示中不能有空格)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
//标程:#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
using namespace std;
int n,a[20],b[20];
int main()
{
//freopen("a.txt","r",stdin);
memset(a,0,sizeof(a));
a[0]=1;
int i;
for(i=1;i<=20;i++) a[i]=a[i-1]<<1;
while(scanf("%d",&n)!=EOF)
{
memset(b,0,sizeof(b));
int temp=n,j=0;
while(temp)
{
for(i=0;a[i]<=temp;i++);
b[j++]=i-1;
temp=temp-a[i-1];
if(temp==1) b[j++]=0, temp=0;
}
string s="";
for(i=0;i<j;i++)
{if(b[i]!=1) s=s+"2(";
if(b[i]==0 && i==j-1) { s=s+"2(0)"; continue; }
if(b[i]==1 && i!=j-1) { s=s+"2+"; continue; }
if(b[i]==1 && i==j-1) { s=s+"2"; continue; }
if(b[i]>8) { s=s+"2(2+2(0))+", b[i]-=8;}
if(b[i]==8) { s=s+"2(2+2(0))", b[i]-=8; }
if(b[i]>4) {s=s+"2(2)+", b[i]-=4; }
if(b[i]==4) {s=s+"2(2)", b[i]-=4; }
if(b[i]>2) { s=s+"2+", b[i]-=2; }
if(b[i]==2) { s=s+"2", b[i]-=2; }
if(b[i]==1) {s=s+"2(0)"; b[i]-=1; }
if(b[i]==0) s=s+")";
if(i!=j-1) s=s+"+";
}
cout<<s<<endl;
}
return 0;
}