洛谷P1010 冪次方

題面
題目描述
任何一個正整數都可以用22的冪次方表示。例如

137=27+23+2^0

同時約定方次用括號來表示,即a^b
可表示爲a(b)。

由此可知,137可表示爲:2(7)+2(3)+2(0)

進一步:

7= 22+2+20 (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)

輸入格式
一個正整數n(n≤20000)

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

輸入輸出樣例
輸入 #1 複製
1315
輸出 #1 複製
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2

分析
根據題目可以得知,這一道題目的意思是將一個數拆分乘2的若干次方,之後再對其中的次方數進行拆分(再對拆分後的數進行拆分,直到不可以拆分爲止)

很明顯,這是一種遞歸的思想·(雖然我先看了題解)
這裏給出筆者看過題解後恍然大悟的思路:
①找出與當前數最接近的二的平方數
②對這個平方數進行拆分(上一步同時記錄下來這是2的多少次方,對指數進行判斷,根據題意來)
③判斷這裏的數是否可以再拆分了(不能就直接GG退出)

這裏我們要思考一下對指數的判斷,根據題目可知以下的特殊情況:
指數爲 0 :直接輸出
指數爲 1:不用管
指數爲 2:直接輸出
我們不妨可以發現,以上的幾個都是無法再次進行拆分的了
但是對於上面第二個的處理,我們可以每次搜索前都直接輸出一個2(在可取時)
之後的幾個無非是if二等判斷了

代碼

#include <bits/stdc++.h>
using namespace std;

int n;

void search(int x) {
	if (n != 0) {
		int p = 0, q = 1;
		while (x >= q) p++, q*=2;  //找打最接近的2的平方數
		p--, q /= 2;
		//每一次拆分都是需要這樣的,不僅是指數爲1的情況,每一次拆分前根據題目所需要的格式也要輸出出來
		cout<<2;
		
		if (p == 0 || p == 2) cout<<'('<<p<<')';    //特殊情況
		//一般情況
		if (p >= 3) {
			cout<<'('; search(p); cout<<')'; 
		}
		//看看能不能繼續搜索
		if (x - q > 0) {
			x -= q; cout<<'+'; search(x);
		}
	}
}

int main() {
	cin>>n;
	
	search(n);
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章