天天看点

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.