-
题目描述:
-
Every positive number can be presented by the exponential form.For example, 137 = 2^7 + 2^3 + 2^0。
Let's present a^b by the form a(b).Then 137 is presented by 2(7)+2(3)+2(0). Since 7 = 2^2 + 2 + 2^0 and 3 = 2 + 2^0 , 137 is finally presented by 2(2(2)+2 +2(0))+2(2+2(0))+2(0).
Given a positive number n,your task is to present n with the exponential form which only contains the digits 0 and 2.
-
输入:
-
For each case, the input file contains a positive integer n (n<=20000).
-
输出:
-
For each case, you should output the exponential form of n an a single line.Note that,there should not be any additional white spaces in the line.
-
样例输入:
-
1315
-
样例输出:
-
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
-
来源:
- 2006年上海交通大学计算机研究生机试真题
- 这道题是考察递归,关键是要分析清楚递归结构,对于一个整数n,他可以分解成2的某次幂和另外一个数的和,即n=2^x+y,(其中x是满足2^x<=n最大的x),这样递归结构就很清晰了,要打印f(n),即等价于打印2(f(x))+f(y),递归的边界条件是x==1,或x==2.例如7=2^2+3,即f(7)=2(f(2))+f(3)=2(f(2))+f(2)+f(1),由于f(2)和f(1)到达了边界条件,所要可以直接打印出来,即f(2)=2,f(1)=2(0)所以f(7)=2(2)+2+2(0);
- 实现代码如下:
-
#include<iostream> using namespace std; void print(int n) { int p=0,r; while((1<<p)<=n) p++;//寻找不会超过n的最大的2^p p--; if(p==0) cout<<"2(0)";//这里的p是幂,故p等于0的时候,相当于x=1 else if(p==1) cout<<"2"; else cout<<"2(",print(p),cout<<")";//逗号隔开是顺序执行的哦,我是为了缩减代码才这样写的 r=n-(1<<p);//处理n减去2的p次幂余下的数 if(r) cout<<"+",print(r); } int main() { int n; while(cin>>n) print(n),cout<<endl; return 0; }