算法_递归(正整数的幂次方表示)

递归

一、概念

函数调用自身。

注意:递归程序可能更加简洁,但是不一定节省时间。

二、案例

案例网址: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 }
posted @ 2018-09-20 23:12  yaoone  阅读(1573)  评论(0编辑  收藏  举报