题目描述
任何一个正整数都可以用22的幂次方表示。例如
137=2^7+2^3+2^0137=27+23+20
同时约定方次用括号来表示,即a^bab 可表示为a(b)a(b)。
由此可知,137137可表示为:
2(7)+2(3)+2(0)2(7)+2(3)+2(0)
进一步:
7= 2^2+2+2^07=22+2+20(2^1用2表示),并且
3=2+2^03=2+20
所以最后137137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2^{10} +2^8 +2^5 +2+11315=210+28+25+2+1
所以13151315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入输出格式
输入格式:
一个正整数n(n≤20000)n(n≤20000)。
输出格式:
符合约定的nn的0,20,2表示(在表示中不能有空格)
输入输出样例
输入样例#1: 复制
1315
输出样例#1: 复制
View Code
View Code
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
虽然是一道水题 但是搞了好久 而且代码写的一塌糊涂
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 12 int flag1=1; int flag2=1; void put(int n) { int temp=1; while(temp<=n)temp*=2; temp/=2; flag2=flag1=1; while(temp) { if(temp&n) { if(temp>4) { if(flag1)flag1=0; else printf("+"); printf("2("); put( log2(temp) ); printf(")"); } else { if(flag2)flag2=0; else printf("+"); if(temp==1) printf("2(0)"); else if(temp==2) printf("2"); else if(temp==4) printf("2(2)"); } } flag1=0; temp>>=1; } } int main() { int n; RI(n); put(n); return 0; }
巨佬的题解
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; string run(int x,int i=0,string s=string("")){ if(x==0)return string("0"); do if(x&1)s=(i==1?"2":"2("+run(i)+")")+(s==""?"":"+")+s;//拼接字符串,应题意,要把低次方接在后面 while(++i,x>>=1);//每次向右移位 return s; } int main(){ int x;cin>>x; cout<<run(x)<<endl; }