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

2021-06-29 15:56:50 字數 1088 閱讀 7287

//這個遞迴挺難得,湊合看懂

任何乙個正整數都可以用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表示(在表示中不能有空格)

樣例輸入?

1

137

樣例輸出?

1

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

樣例輸入?

1

1315

樣例輸出?

1

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

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

解題思路

基本演算法是數轉二進位制,使用求餘+除法迴圈計算。題目提示了遞迴,但是一下遞迴不容易寫對而且不好除錯,可以一步步來,先寫成某個數的次方和,除錯正確後再對次方遞迴解析。

遞迴時,上一次計算的次方成為新的數,應該注意這個數為0和為2時的特殊情況。

乙個數被分解後,成為剩餘的數+2的次方,這兩個數其中之一都可能為0,應該注意只有這兩個數都非零時才輸出'+'號

#include#include#include#include#include#includeusing namespace std;

void put(int num,int n)

}}int main()

藍橋杯 演算法訓練 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 進一步 ...