描述:
-
任何一个正整数都可以用2的幂次方表示。例如:
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)
又如:
1315=210+28+25+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表示(在表示中不能有空格)。
样例输入:
-
137
样例输出:
-
2(2(2)+2+2(0))+2(2+2(0))+2(0)
来源:
- NOIP1998复赛 普及组 第一题
思路:
根据题目描述可以看出是用递归,因为不好保存括号加号,所以可以边递归边输出。
递归函数的参数为n,设p,s,用p*=2来表示n,s用来表示指数,写一个while(p/2<=n)循环,如果p/2等于n则n能用2的s-1次方表示,所以继续递归2( digui(s-1) );如果p/2不等于n,则n用2的s-1次方加n-p/2表示,所以继续递归2( digui(s-1) )+digui(n-p/2)。所以临界条件为,n==1和n==2时。
代码如下:
#include <iostream> using namespace std; void digui(int n); int main() { int n; cin>>n; digui(n); return 0; } void digui(int n){ //临界条件 if(n==2){ cout<<"2"; return; } if(n==1){ cout<<"2(0)"; return; } int p=1,s=0; while(p<=n){ p*=2; s++; } if(n==p/2){ cout<<"2("; digui(s-1); cout<<")"; } else{ //因为2的一次方是2不是2(1),所以单独讨论 if(p/2==2){ cout<<"2+"; digui(n-p/2); } else{ cout<<"2("; digui(s-1); cout<<")+"; digui(n-p/2); } } }