南橋 演算法訓練 2的次冪表示

2021-09-07 10:55:10 字數 1651 閱讀 8262

題目詳情

問題描寫敘述

不論什麼乙個正整數都能夠用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...