算法_递归(正整数的幂次方表示)
递归
一、概念
函数调用自身。
注意:递归程序可能更加简洁,但是不一定节省时间。
二、案例
案例网址:http://cxsjsxmooc.openjudge.cn/2018t2fallw2/2/
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
任何一个正整数都可以用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复赛 普及组 第一题
三、案例解析
1.任何一个正整数都可以用2的幂次方的和表示,幂次是二进制表示中非0的位置数(右起记为0)。
2.二进制表示时,第0位为1表示为2(0),第1位为1表示为2,其余位为1递归处理,直至可以用2(0)、2进行表示。
四、源代码
1 #include<iostream> 2 using namespace std; 3 int GetBin(int n, int i) 4 {
// 取n的第i位 5 return ((n >> i) & 1); 6 } 7 void fun(int n) 8 { 9 int add_flag = 1; 10 for(int i = 15; i >= 0; i--) 11 { 12 if(GetBin(n, i) == 1) 13 { 14 //cout << i << endl; 15 if(add_flag == 0) 16 { 17 cout << "+"; 18 } 19 else 20 { 21 add_flag = 0; 22 } 23 if(i == 0) //二进制表示时,第0位为1 24 { 25 cout << "2(0)"; 26 } 27 else if(i == 1) //第1位为1 28 { 29 cout << "2"; 30 } 31 else 32 { 33 cout << "2("; 34 fun(i); 35 cout << ")"; 36 } 37 } 38 } 39 } 40 int main() 41 { 42 int n; 43 cin >> n; 44 fun(n); 45 return 0; 46 }