演算法_遞迴(正整數的冪次方表示)
阿新 • • 發佈:2018-12-11
遞迴
一、概念
函式呼叫自身。
注意:遞迴程式可能更加簡潔,但是不一定節省時間。
二、案例
案例網址: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
所以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> 2using 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 }