1. 程式人生 > >演算法_遞迴(正整數的冪次方表示)

演算法_遞迴(正整數的冪次方表示)

遞迴

一、概念

函式呼叫自身。

注意:遞迴程式可能更加簡潔,但是不一定節省時間。

二、案例

案例網址: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 }