【乙個比較經典的演算法題目】
問題描述
任何乙個正整數都可以用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 2void tobinary(int n,int
x);3
intmain()416
17return0;
18}19void tobinary(int n,int
x)20
36else
3742}43
}44 }
程式二:完整程式的實現。
1 #include 2void 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 2void 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...