藍橋杯——算法訓練——2的次冪表示

藍橋杯——算法訓練——2的次冪表示

——————————————————————————————————————
資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
任何一個正整數都可以用22進製表示,例如:13713722進製表示爲1000100110001001
將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=27+23+20137=2^7+2^3+2^0
現在約定冪次用括號來表示,即aba^b表示爲a(b)a(b)
此時,137137可表示爲:2(7)+2(3)+2(0)2(7)+2(3)+2(0)
進一步:7=22+2+207=2^2+2+2^0212^122表示),3=2+203=2+2^0
所以最後137137可表示爲:2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=210+28+25+2+11315=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)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表示(在表示中不能有空格)
樣例輸入
137137
樣例輸出
2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)
樣例輸入
13151315
樣例輸出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
遞歸實現會比較簡單,可以一邊遞歸一邊輸出
——————————————————————————————————————
思路分析:還有啥好分析的呢,提示已經一步給到位了——一邊遞歸一邊輸出呀,直接看代碼(實現過程參照註釋):

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章