题目描述 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.