description
任何乙個正整數都可以用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(21用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)
input
每個測試檔案只包含一組測試資料,每組輸入乙個正整數n(n<=20000)。
output
對於每組輸入資料,輸出符合約定的n的0,2表示。(在表示中不能有空格)
sample input 1
137sample output 1
2(2(2)+2+2(0))+2(2+2(0))+2(0)
sample input 2
73sample output 2
2(2(2)+2)+2(2+2(0))+2(0)
解題思路:
(1)統計該數字的中二進位制1的位數;可以利用
1)與運算
2)右移
實際上這是計算機思維,利用數學思維則是利用
1)用該數%2,再判斷餘數是否為1;
2)將該數n/2 並再次賦值給n 即n /= 2;
這兩種其實是一樣的,後面這種的數學思維最後轉化在計算機裡仍是利用
與運算 和 右移運算;
(2)不斷遞迴,觀察到題目最後結果只有2(2),和2和2(0)這三種形式,故遞迴的最終結束條件就是這三個;
**如下:
1 #include2using
namespace
std;34
intn ,tmp;
5void digui(int
n) //遞迴函式
617 n>>=1
; //向右移一位;
18 i++;19}
2021
22for( i = count1 - 1;i >= 0;i--)
23else
28if(flag[i]==1
) //如果序號為1 ,即輸出2(1);
29else
32if(flag[i]==2
) //如果序號為2 ,即輸出2(2);
33else
3641
if(i!=0) cout<<"+"
;42}43
}44intmain()
45
二的冪次方
任何乙個正整數都可以用2的冪次方表示。例如 137 27 23 2 0 27 23 20 27 23 20,同時約定次方用括號來表示,即a b ab ab可表示為a b 由此可知,137可表示為 2 7 2 3 2 0 進一步 7 22 2 20 22 2 20 22 2 20 2 1 21 21用...
2的冪次方
2的冪次方 noip1998 問題描述 任何乙個正整數都可以用2的冪次方表示。例如 137 2 7 2 3 2 0 同時約定方次用括號來表示,即ab可表示為a b 由此可知,137可表示為 2 7 2 3 2 0 進一步 7 2 2 2 2 0 21用2表示 3 2 2 0 所以最後137可表示為 ...
2的冪次方表示
題目 任何乙個正整數都可以用2的冪次方表示。例如 137 27 23 20 同時約定方次用括號來表示,即ab 可表示為a b 由此可知,137可表示為 2 7 2 3 2 0 進一步 7 22 2 20 21用2表示 3 2 20 所以最後137可表示為 2 2 2 2 2 0 2 2 2 0 2 ...