p1017 進製轉換 解題記錄

2021-07-27 06:53:02 字數 1391 閱讀 6606

檢視原題點 這裡 。

這道題說到底還是用短除法遞推求解。只是基數從整數變成了負數,所以相應的過程有細微的變化。

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這樣的形式。與之相似的,對...