- 题目链接:P1010
- 题目大意:
任何一个正整数都可以用222的幂次方表示。例如
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)
输入整数n(n≤20000),按上述形式表示n - 思路:
第一遍想到的是打表的方法,既然数据这么小,就可以一位位取出来进行进行输出,可以从大到小直接输出,也可以按位法拼接字符串输出,下面给出的代码是利用前者。后来在学习别的代码的时候又习得了一种递归的思路,代码的实现稍有难度。 - 代码:
打表:
#include <bits/stdc++.h>
using namespace std;
int n,k,a[16]{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
string s;
int main(){
cin>>n;
for(int i=15;i>=0;i--)
if(n>=a[i]){
n-=a[i];
if(k) printf("+");
else k++;
if(i==0) printf("2(0)");
if(i==1) printf("2");
if(i==2) printf("2(2)");
if(i==3) printf("2(2+2(0))");
if(i==4) printf("2(2(2))");
if(i==5) printf("2(2(2)+2(0))");
if(i==6) printf("2(2(2)+2)");
if(i==7) printf("2(2(2)+2+2(0))");
if(i==8) printf("2(2(2+2(0)))");
if(i==9) printf("2(2(2+2(0))+2(0)");
if(i==10) printf("2(2(2+2(0))+2)");
if(i==11) printf("2(2(2+2(0))+2+2(0))");
if(i==12) printf("2(2(2+2(0))+2(2))");
if(i==13) printf("2(2(2+2(0))+2(2)+2(0))");
if(i==14) printf("2(2(2+2(0))+2(2)+2)");
if(i==15) printf("2(2(2+2(0))+2(2)+2+2(0))");
}
}
递归:
#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;
}