进制转换问题
问题描述
将十进制数N和其他d进制之间进行转换时计算机实现计算的基本问题,解决方案较多,其中最简单的方法是除d取余法,例如,(1348)10=(2504)8。
过程如:
可以看出,最先产生的余数4是转换结果的最低位,这正好符合栈“LIFO”特性,所以可以用顺序栈来模拟该过程。
基本要求
对于键盘输入的任意一个非负十进制整数,打印出与其相等的八进制数。由于上述计算过程是从低位到高位顺序产生的八进制数的各个位,再打印输出,而人类习惯,应从高位到低位进行,恰好与计算过程相反。因此可以先将计算过程中得到的八进制数的各位进栈,等到相对应的八进制数的各位产生后,再按顺序出栈,打印输出,即得到与输入的十进制相对应的八进制。
问题实现
在操作过程的任何状态下都有可能的操作:“入”和“出”。每个状态下处理问题的方法都是相同的,这说明该问题具有递归性质,可以考虑递归算法实现。输入序列可以仅由一对整型变量表示,用栈实现。
代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100 //数组大小
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef struct //定义顺序栈
{
int *base;//栈低指针
int *top;//栈顶指针
int stacksize;//栈可以使用的最大存储容量
} SqStack;
int p;
int IntStack(SqStack &S)//创建顺序栈
{
S.base=new int[MAXSIZE];//开辟一个大小为MAXSIZE的int型 数组作为栈,栈低指针base指向它的基地址
if(!S.base) exit(OVERFLOW);//存储空间分配失败,退出当前程序
S.top=S.base;//初始化栈为空//有说头:一开始 S.base=S.top
S.stacksize=MAXSIZE;//stacksize置为栈的最大容量
return OK;
}
int Push(SqStack &S,int e)//入栈函数
{
if(S.top-S.base==S.stacksize) return ERROR;//栈满
*S.top++=e;
return OK;
}
int Pop(SqStack &S,int &e)//出栈函数
{
if(S.base==S.top) return ERROR;//栈空
e=*--S.top;//栈顶元素减一,将栈顶元素赋给e
return OK;
}
int ZhuanH(SqStack &S,int n,int k)//n是待转换数,k是转换的进制
{
if(n)
{
p=n%k;
Push(S,p);
}
else
{
return OK;
}
ZhuanH(S,n/k,k);
}
int main()
{
printf("本程序进行进制之间的转换\n");
int e,k,n;
SqStack S,M;
printf("请输入要转换的数n和转换的进制k(可以使用空格分开):\n");
scanf("%d%d",&n,&k);
IntStack(S);
IntStack(M);
ZhuanH(S,n,k);
printf("******************%d转换为%d进制后的结果:**********************\n",n,k);
for(;S.top-S.base;)
{
Pop(S,e);
Push(M,e);
printf("%d",e);
}
printf("\n\n********由于上述计算过程是从低位到高位顺序产生的八进制数的各个位,再打印输出:**********\n");
for(;M.top-M.base;)
{
Pop(M,e);
printf("%d ",e);
}
return 0;
}