2的次冪表示 遞迴演算法訓練

2021-09-21 16:32:56 字數 1729 閱讀 9971

【乙個比較經典的演算法題目】

問題描述

任何乙個正整數都可以用2進製表示,例如:137的2進製表示為10001001。

將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表示式:137=2^7+2^3+2^0

現在約定冪次用括號來表示,即a^b表示為a(b)

此時,137可表示為:2(7)+2(3)+2(0)

進一步:7=2^2+2+2^0 (2^1用2表示)

3=2+2^0 

所以最後137可表示為:2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:1315=2^10+2^8+2^5+2+1

所以1315最後可表示為:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

輸入格式

正整數(1<=n<=20000)

輸出格式

符合約定的n的0,2表示(在表示中不能有空格)

樣例輸入

137樣例輸出

2(2(2)+2+2(0))+2(2+2(0))+2(0)

樣例輸入

1315

樣例輸出

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示用遞迴實現會比較簡單,可以一邊遞迴一邊輸出

分析:本題可以參考乙個演算法:遞迴輸出某十進位制數的二進位制表示的演算法。(主要是在遞迴回溯的時候才輸出,而非計算出來就輸出。)

本著從易到難的原則,可以考慮先實現將137表示為:2(7)+2(3)+2(0)的程式。

關於把指數也轉變為0和2的序列:在輸出每一項時判斷指數是否超過1,超過則先輸出「2(」,然後把該指數與0傳入遞迴函式,遞迴顯示該指數的表示。然後在輸出後半邊括號。

嗯可以先看看遞迴輸出乙個整數的二進位制序列:

程式0:

#include void fun(intn)}

intmain()

程式一:實現將137表示為:2(7)+2(3)+2(0)的程式.

1 #include 2

void tobinary(int n,int

x);3

intmain()416

17return0;

18}19void tobinary(int n,int

x)20

36else

3742}43

}44 }

程式二:完整程式的實現。

1 #include 2

void tobinary(int n,int

x);3

intmain()419

20return0;

21}22void tobinary(int n,int

x)23

39else

4051}52

else

5362}63

}64}65

}66 }

更新:上述**的if邏輯可以簡化。

1 #include 2

void tobinary(int n,int

x);3

intmain()419

20return0;

21}22void tobinary(int n,int

x)23

39else

4050}51

}52}53 }

演算法訓練 2的次冪表示(遞迴)

問題描述 任何乙個正整數都可以用2進製表示,例如 137的2進製表示為10001001。將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表示式 137 2 7 2 3 2 0 現在約定冪次用括號來表示,即a b表示為a b 此時,137可表示為 2 7 2 3 2 0 進一步 ...

演算法訓練 2的次冪表示 遞迴實現

問題描述 任何乙個正整數都可以用2進製表示,例如 137的2進製表示為10001001。將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表示式 137 2 7 2 3 2 0 現在約定冪次用括號來表示,即a b表示為a b 此時,137可表示為 2 7 2 3 2 0 進一步 ...

藍橋 演算法訓練 2的次冪表示 遞迴

直接遞迴 問題描述 任何乙個正整數都可以用2進製表示,例如 137的2進製表示為10001001。將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表示式 137 2 7 2 3 2 0 現在約定冪次用括號來表示,即a b表示為a b 此時,137可表示為 2 7 2 3 2 0...