进制转换问题

进制转换问题

问题描述

将十进制数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;
 }

运行结果

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东篱把酒黄昏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值