洛谷 P1017 進製轉換

2022-05-21 20:54:09 字數 1238 閱讀 6287

p1017 進製轉換

先從正進製開始考慮。

例如二進位制:

18=1*2^4+0*2^3+0*2^2+1*2^1+0*2^0=0+2(1+2(0+2(0+2(1))))

k=a[n]*2^n+a[n-1]*2^(n-1)+...+a[0]*2^0=a[0]+2(a[1]+2(...+2(a[n])...)...)

短除法將k轉換為二進位制就是把k除以二,留下商,記錄下餘數,然後再對商執行此操作,不斷重複直到數變為0,再將所有餘數倒序輸出,根據此式可看出其原理就是第i次除以二時的餘數顯然就是a[i-1]。

然後考慮負進製。

如負二進位制:

k=a[0]-2(a[1]-2(...-2(a[n])...)...)

根據題意,a[0],a[1],...,a[n] >=0

由此可得出將k轉換為負二進位制的短除法方法:(開始時i=0)

①尋找乙個整數p,使得 -2p≤k 且-2p 在可能的範圍內最大,記錄下k-(-2p),即為a[i]

②如果p為0則進入下一步,如果不為0則p->k(將p賦值給k),i++,然後回到第①步

③得出答案:n=i,k=a[n]*(-2)^n+a[n-1]*(-2)^(n-1)+...+a[0]*(-2)^0

(其它進製可由此模擬)

另外,還有一點需要注意:得到p可以用取模運算,但是pascal、c++等對負數的取模有點兒不一樣,需要注意一下。

const sz:array[0..20] of char=('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k');

var a:array[1..1000] of integer;

i,i1,j,n1,n,r,t1,t2:longint;

begin

readln(n1,r);

n:=n1;

while n<>0 do

begin

inc(i1);

t1:=n div r;

t2:=n mod r;

if t2<0 then inc(t1);

a[i1]:=n-r*t1;

n:=t1;

end;

write(n1,'=');

for i:=i1 downto 1 do

write(sz[a[i]]);

write('(base',r,')');

end.

洛谷 P1017 進製轉換

題目描述 我們可以用這樣的方式來表示乙個十進位制數 將每個阿拉伯數字乘以乙個以該數字所處位置的 值減1 為指數,以10為底數的冪之和的形式。例如 123可表示為 1 10 2 2 10 1 3 10 0這樣的形式。與之相似的,對二進位制數來說,也可表示成每個二進位制數碼乘以乙個以該數字所處位置的 值...

洛谷 P1017 進製轉換

我們可以用這樣的方式來表示乙個十進位制數 將每個阿拉伯數字乘以乙個以該數字所處位置的 值減1 為指數,以10為底數的冪之和的形式。例如 123可表示為 1 10 2 2 10 1 3 10 0這樣的形式。與之相似的,對二進位制數來說,也可表示成每個二進位制數碼乘以乙個以該數字所處位置的 值 1 為指...

洛谷 P1017 進製轉換

傳送門 該題考察的較為基礎,雖然俺從前沒有學過負進製除法,但是自己短除取餘,找找規律即可 例如,15 2 7 1,但是,題目說餘數不能為負。餘數怎麼求呢,餘數 15 15 2 之所以得到負數,是因為 15 2的絕對值是小於 15的,且為絕對值的最大值。那麼,在餘數為負數時,我們讓商 1即可,即餘數 ...