天天看點

Wikioi 天梯 十進制轉m進制(1474)

題目描述 Description

将十進制數n轉換成m進制數 m<=16

n<=100

輸入描述 Input Description

共一行

n和m

輸出描述 Output Description

共一個數

表示n的m進制

樣例輸入 Sample Input

樣例1:10 2

樣例2:100 15

樣例輸出 Sample Output

樣例1:1010

樣例2:6A

資料範圍及提示 Data Size & Hint

用反向取餘法

說實話,wikioi天梯裡普及一等以前的題怎麼看都有點教程的性質~~

關于十進制轉m進制的方法,題目下面給得清清楚楚,那麼我的任務就是具體講解一下“反向取餘法”的步驟。

我們首先以十進制下的18為例,假定我們要把它轉化為3進制……

由于筆者寫部落格技術不精,不會構造演算過程,下面貼一張不太雅觀的圖檔~~

Wikioi 天梯 十進制轉m進制(1474)

上圖是筆者弱弱的演算,描述一下就是:

18除3商6,餘0,記下餘數零;6繼續除3商2,記下餘數0;3除不了2了,記下餘數2(商0餘2);除不了了,就把記過的餘數從底向上寫一遍——200就是3進制下的18;

當把一個十進制數轉化為m進制時,你要不斷用m去除原數,每次運算記錄餘數,直到商小于1,然後把記錄的餘數自底向上寫一遍,就得到了m進制下的原數。

簡單說一下我的了解就是(僅供參考):十進制下的一個m就是m進制下的10,19除三商六,三進制下的該數中就包含6個“10”,餘下的1在三進制中湊不成“10”,就留在了個位……(沒懂吧…不嚴謹的表達從來難以聽懂…要是有人懂了,筆者就樂瘋了…)

具體實作時,由于先得到的餘數後輸出,是以可以想到用棧或者遞歸來實作。

順帶一提,這式子(計算)叫短除法;

算法描述:讀入資料;不斷遞歸進行除法,直到商為零時終止遞歸,跳棧時輸出本層遞歸所得餘數。

Program asd;
Var
	x,d:longint;
Const
	a:array[0..16]of char=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G');
Procedure zhuan(bb,dd:longint);
	begin
		if (bb div dd)=0 then begin write(a[bb]);exit;end;
		zhuan(bb div dd,dd);
		write(a[bb mod dd]);
	end;
	
Begin
	readln(x,d);
	zhuan(x,d);
End.