十进制转换为任意进制--C语言数据结构-栈


#前言

本篇文章依照数据结构中的栈来解决进制转换的问题,希望对读者有所帮助

进制转换原理

十进制数N和其他d进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理:N=(N div d) × d+N mod d(其中,div为整除运算,mod为求余运算)
例如:(1348)10=(2504)8,其运算过程如图:

十进制转换八进制图片

算法原理

对于输入的任意一个非负十进制整数,输出与其等值的八进制数。上述计算过程是从低位到高位顺序产生八进制数的各个数位;而输出过程应从高位到低位进行,恰好和计算过程相反,因而我们可以使用栈来解决这个问题。在计算过程中依次将得到的余数压入栈中,计算完毕后,再依次弹出栈中的余数就是数制转换的结果。

因此这个算法我们可以根据数据结构中的栈这一结构来编写。

算法详解

算法编译环境

首先你要有一个含有栈的基本操作的头文件
https://blog.csdn.net/Liu1_1_/article/details/133855448

#include<stdio.h>
#include"Seqstack.h"

算法步骤

① 初始化一个空栈S。
② 当十进制数N非零时,循环执行以下操作:
	·把N与8求余得到的八进制数压入栈S;
	·N更新为N与8的商。
③ 当栈S非空时,循环执行以下操作:
	·弹出栈顶元素e;
	·输出e

算法实现

//十进制与R进制的转换
int conversion(int X, int r)
{
	/*入口参数  十进制数字n   转换进制类型r  转换成功返回1 失败返回0*/
	PSeqStack S;				//定义栈
	int x;
	if (!r)
	{
		printf("基数不能为0");
		return 0;
	}
	S = Init_SeqStack();   //初始化栈
	if (!S)
	{
		printf("栈初始化错误!");
		return 0;
	} 
	while (X)
	{
		Push_SeqStack(S, X % r);     //余数入栈
		X = X / r;
	}
	while (!Empty_SeqStack(S))      //判断栈是否为空
	{
		Pop_SeqStack(S,&x);			//出栈,并将元素保存到x中
		printf("%d", x);			//输出栈中的元素
	}
	Destroy_Seqstack(&S);			//销毁栈
}

主函数

void main()
{
	int r, num;
	printf("输入要转换的十进制整数:");
	scanf("%d", &num);
	printf("要转换为的进制为:");
	scanf("%d", &r);
	printf("十进制整数%d转换为%d进制为:", num, r);
	conversion(num,r);   //进制转换
	printf("\n\n\n");

}

运行结果

进制转换结果

算法分析

显然,该算法的时间和空间复杂度均为O(log8n)。
这是利用栈的后进先出特性的最简单的例子。
在这个例子中,栈的操作是单调的,即先一味地入栈,然后一味地出栈。也许,有的读者会提出疑问:用数组直接实现不是更简单吗?但仔细分析上述算法不难看出,栈的引入简化了程序设计的问题,划分了不同的关注层次,使思考范围缩小了。而用数组不仅掩盖了问题的本质,还要分散精力去考虑数组下标增减等细节问题。
在实际利用栈的问题中,入栈和出栈操作大都不是单调的,而是交错进行的。相关问题如括号匹配,匹配舞伴等等,有兴趣请查看作者博客!

进制转换此篇文章只是整数之间的转换,小数之间的转换需要依靠数据结
构中队列这一结构,详细算法教程请关注博主的博客。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值