題目詳情
問題描寫敘述
不論什麼乙個正整數都能夠用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)
提示用遞迴實現會比較簡單。能夠一邊遞迴一邊輸出
思路:1、先把輸入的10進製數轉換為2進製數
2、對二進位制陣列按位處理,把原十進位制數表示為對應的二進位制表示(如:137=2^7+2^3+2^0),注意紅色標記內容
3、推斷指數能否繼續表示為二進位制。就是題目提示的遞迴啦
注意事項:1、二進位制陣列從後向前輸出才是原十進位制的二進位制形式,所以處理的時候要從最後一位開始。
2、 ^ 轉換成() 後。要新增對()的輸出控制,2^1要直接輸出2,而對於2^0和2^2分別輸出2(0)和2(2)。
3、對於加號的控制。最後一位處理後不需輸出加號,從某一位開始後面全為0。該位處理後不需輸出加號。
**:
#includevoid solve(int n)
//當指數為1時(即2(1)不用輸出)
if(n==1)
/*******以上為遞迴出口********/
char str[20];
int i=0,j,len,q;
//轉換為2進製。得到的字串為原來的倒敘排列
while(n)
len = i;
/*while() 用於標示倒數第幾個不為0。用於控制+號的輸出*/
q=0;
while(str[q]=='0')
/*對2進製串按位處理*/
/*變數 j 用於標示當前處理是第幾位,用於控制()的輸出*/
for(i--,j=1;i>=0;i--,j++)else
/*遞迴處理*/
solve(len-j);
/*若當前處理的字元後另一位(該位為2(1)。則省略括號)*/
if((len-j)==1);
else
/*當前處理最後一位,或當前位的後面全是0。不用輸出+*/
if((len-j)==0 || i==q);
else
} }}int main()else
return 0;
}
演算法訓練 2的次冪表示
演算法訓練 2的次冪表示 時間限制 1.0s 記憶體限制 512.0mb 問題描述 任何乙個正整數都可以用2進製表示,例如 137的2進製表示為10001001。將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表示式 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的次冪表示 問題描述 任何乙個正整數都可以用2進製表示,例如 137的2進製表示為10001001。將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表示式 137 2 7 2 3 2 0 現在約定冪次用括號來表示,即a b表示為a b 此時,137可表示為 2 7...