1.数制转换
数值进位制的换算是计算机实现计算和处理的基本问题。比如将十进制数m转换为n进制的数,最常用的算法是除n取余法。这种方法是将十进制数m每次除以n,直到商为0时为止。将所得的余数依次进栈,然后按“后进先出”的次序出栈便得到转换结果。其基本原理是:
m=(m / n)* n + m % n ( 其中: / 为整除,%为求余 )
例 将十进制数1567转换为八进制数。
设m=1567 ,n=8。按照除8取余法,转换方法和结果如下:
按照上述除8取余法,得到的余数依次是7,3,0,3。在转换过程中每得到一个余数则进栈保存,最先得到的余数7在栈底,最后得到的余数3在栈顶,转换完毕后依次出栈,其输出顺序与计算顺序正好相反,为3、0、3、7。数值3037即为转换后的八进制数,可表示为:
(1567)10 =(3037)8
将十进制数转换为n进制数的过程中,计算顺序与输出顺序正好相反。因此,利用栈解决这个问题是很合适的。
算法原理:
(1)逐次计算得到相关结果,先计算得到的结果后输出;
(2)把逐次得的余数依次进栈,计算结束后依次出栈。
算法要点(采用顺序栈):
(1)m!=0 ,m%n 的余数进栈;
若m==0,结束求余运算,依次进行出栈操作;
(2)m=m/n;
(3)重复(1)和(2)。
利用顺序栈将任意的十进制非负整数转换为等价的n进制数输出的完整程序如下 :
#include#include#define MaxSize 100 /*定义顺序栈所能存储的最多的元素的个数*/typedef int ElemType; /*数据元素类型一般用ElemType表示*/struct SeqStack{ /*顺序栈的类型定义*/ElemType data[MaxSize]; /*用data数组存储栈中所有的数据元素*/int top; /*用整型变量top指示栈顶元素的位置*/};#include "顺序栈基本操作.c" /*顺序栈的6种运算包含在此文件中*/void transform(int m, int n) /*将一个十进制整数m转换为n进制数输出函数*/{int k; /*用来保存余数*/int mm=m; /*用来保存被转换的十进制数m*/ struct SeqStack S; /*顺序栈的变量定义*/InitStack(&S); /*将顺序栈a初始化*/while(m!=0) {k=m%n; /*将十进制数m除以n进制数的余数存入k*/Push(&S,k); /*将k的值进栈a中*/m=m/n; /*用m除以n的整数商又赋给m*/}printf("十进制数 %d 转换为 %d 进制数为: