檢視原題點 這裡 。這道題說到底還是用短除法遞推求解。只是基數從整數變成了負數,所以相應的過程有細微的變化。
p.s. 短除法的原理可以看之前寫的 進製轉換的原理 。
過程與原來的短除法相似,這次以 -2 為基數舉例。
設原來的十進位制數為 n,轉換後的 -2 進製數為 abcd(當然結果不一定是 4 位數,只是舉個例子)。
現在已知 x,求 abcd,那麼寫出等式:(a
bcd)
−2=(
n)10
將左邊轉換為 10 進製,得到:a×
(−2)
3+b×
(−2)
2+c×
(−2)
1+d×
(−2)
0=n
除了最後一項 d 外,前幾項都有公因式 -2,於是因式分解:−2
×(a×
(−2)
2+b×
(−2)
1+c)
+d=n
簡便起見,將 a×
(−2)
2+b×
(−2)
1+c 簡寫為 k,於是等式變成:−2
k+d=
n 如果把 n 看成被除數,-2 看成除數,k 看成商,d 看成餘數,那麼等式就可以寫成:n÷
(−2)
=k…d
至此所有的步驟與正基數的短除法相同。下面就是本題最有趣的部分。
我們都知道餘數和被除數的符號是相同的。
當 n 大於等於 0 時,處理方式還是和原來一樣的。但是如果 n 小於 0 的話,那麼 d 也會小於 0,但是我們知道 d 一定是在 [0, 2) 範圍內的正整數,所以就需要對等式進行一些變換,使得餘數大於等於 0:n÷
(−2)
=k+1
…d+2
也就是說,把商加一,餘數再減去乙個除數,等式還是成立的。因為餘數的絕對值一定是小於除數的絕對值,因此減去乙個除數(相當於加上除數的絕對值)就能令餘數非負,此時就能繼續像以前一樣計算了。
總結一下就是:還是用短除法,只是當餘數小於 0 時,把商加一,把餘數減去除數(即基數)使之為正,並保持等式成立,然後就直接像往常一樣計算就行了。
#include
using
namespace
std;
int ans[105], end=0;
int main()
ans[end++]= mod;
x= rst;
}printf("%d=", num);
for(int i=end-1; i>=0; --i)
printf("(base%d)\n", base);
return
0;}
P1017 進製轉換
我們可以用這樣的方式來表示乙個十進位制數 將每個阿拉伯數字乘以乙個以該數字所處位置的 值減1 為指數,以10為底數的冪之和的形式。例如 123可表示為 1 102 2 101 3 1001 times 10 2 2 times 10 1 3 times 10 01 102 2 10 1 3 100 ...
P1017 進製轉換
題目描述 我們可以用這樣的方式來表示乙個十進位制數 將每個阿拉伯數字乘以乙個以該數字所處位置的 值減11 為指數,以1010為底數的冪之和的形式。例如 123123可表示為 1 times 10 2 2 times 10 1 3 times 10 01 10 2 2 10 1 3 10 0這樣的形式...
P1017 進製轉換
我們可以用這樣的方式來表示乙個十進位制數 將每個阿拉伯數字乘以乙個以該數字所處位置的 值減11 為指數,以1010為底數的冪之和的形式。例如 123123可表示為 1 times 10 2 2 times 10 1 3 times 10 01 102 2 101 3 100這樣的形式。與之相似的,對...