除j取余法的数学原理如下:
其中j表示进位制的大小。并且,N = (N / j) * j + N % j(/为整除,%为求余)。
结合栈的知识(详见、),我们将十进制数每次除以j,所得的余数依次进栈,然后按“后进先出”的次序便得到转换的结果。这就需要用到循环。以下是算法的核心思想:
(1)若N != 0,则将N%j取得的余数压入栈s中,执行步骤(2);若N = 0,将栈s的内容依次出栈,算法结束。
(2)用N / j代替N。
(3)当N > 0,则重复步骤(1)、(2)。
下面我们以一个具体问题来展示以下算法的实现:将十进制数转换为八进制数。
void Conversion()/*将十进制数转换为八进制数*/
{
int x;
Stack *Dstack;
Dstack = InitStack();
scanf("%d", &x);
while(x != 0)
{
Push(Dstack, x % 8);/*进栈次序是个位、十位……*/
x = x / 8;
}
ShowStack(Dstack);
}
以上代码是用顺序栈实现的,若用链栈实现,对代码稍加修改即可:
void Conversion()/*将十进制数转换为八进制数*/
{
int x;
scanf("%d", &x);
Node *top;
top = (Node *)malloc(sizeof(Node));
top->data = x % 8;
top->link = NULL;
x = x / 8;
while(x != 0)
{
Push(top, x % 8);/*进栈次序是个位、十位……*/
x = x / 8;
}
ShowStack(top);
}
数制转换的核心就是利用栈“后进先出”的特性,实现转换后数字的输出。
文益民 张瑞霞 李健 编著,数据结构与算法(第2版),清华大学出版社,P47-48.