題目描述 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進制……
由于筆者寫部落格技術不精,不會構造演算過程,下面貼一張不太雅觀的圖檔~~
上圖是筆者弱弱的演算,描述一下就是:
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.