藍橋杯——算法訓練——2的次冪表示
——————————————————————————————————————
資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
任何一個正整數都可以用進製表示,例如:的進製表示爲。
將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:
現在約定冪次用括號來表示,即表示爲
此時,可表示爲:
進一步: (用表示),
所以最後可表示爲:
又如:
所以1315最後可表示爲:
輸入格式
正整數(1<=n<=20000)
輸出格式
符合約定的n的0,2表示(在表示中不能有空格)
樣例輸入
樣例輸出
樣例輸入
樣例輸出
提示
用遞歸實現會比較簡單,可以一邊遞歸一邊輸出
——————————————————————————————————————
思路分析:還有啥好分析的呢,提示已經一步給到位了——一邊遞歸一邊輸出呀,直接看代碼(實現過程參照註釋):
#include <iostream>
using namespace std;
void f(int a){
if(a == 2) cout<<"2"; // 2^1直接表示爲2
else{
cout<<"2"; // 不爲2的話一定是2()的形式
if(a == 1) cout<<"(0)"; // 2^0是2(0),這一點比較特殊,所以提出來
else{
int kk = 0, flag = 2;
while(a/flag > 0){
kk++; // kk中存儲二進制表示的不爲0的最高位
flag *= 2; // 別忘了這一也要往上迭,之所以不用數組轉換二進制,考慮到是遞歸,餘數還有用
}
flag /= 2; // 由於while的停止條件多算了一位
int y = a % flag; //y 中存儲餘數,根據例子顯然要分步處理
if(kk != 1){ // 最高位不爲1的話繼續處理
cout<<"(";
f(kk);
cout<<")";
}
if(y > 0){ // 餘數不爲0的話繼續處理
cout<<"+";
f(y);
}
}
}
}
int main(){
int n;
while(cin>>n){
f(n);
cout<<endl;
}
return 0;
}