大家都知道,计算机底层计算采用的是二进制,计算机的数据存储也是采用二进制,在网络上,设备与设备之间的通信,最终还是要通过二进制比特流来实现。可以说,二进制是信息时代的基础。那么大家有没有想过,既然计算机采用的是二进制,那为什么我们在电脑、手机上看到的信息是多种多样的呢?这就涉及到进制转换的问题了。比如当我们使用电脑上的计算器计算 98 + 56 时,计算机是先把十进制的 98 和 56 转换成二进制,然后再进行计算。

除了二进制,计算机中比较常用的还用八进制、十六进制等,比如内存地址的表示就是用的十六进制。今天我就带大家学习如何借助「栈」这个数据结构将十进制转换成计算机可以理解的二进制,乃至推广到将十进制转换成任意进制。

先来看一下十进制转二进制的计算过程。就以刚才说的 98 为例,用 2 除 98,取余数,然后再用 2 去除得到的商,取余数……如此循环往复,直到商为零,将余数逆序输出即可得到 98 的二进制表示。具体过程如下:

最后算出 98 的二进制是 1100010。

与二进制类似,如果要将十进制转换成八进制,也是按照除以 8 取余的方式。以98为例,具体过程如下:

最后得出 98 的八进制是142。推而广之,如果我们想把十进制转换成 N 进制(N 是大于等于 2 的自然数),就可以按照这种方式来进行计算。

由于我们要将计算过程中产生的余数逆序输出,也就是先产生的数要后输出,这恰恰符合栈的操作规则,所以当我们把该进制转换的算法实现为程序时,就可以用栈来存储计算过程中产生的余数序列。在写程序之前,先来复习一下栈都有哪些操作接口:

操作接口 功能
size() 报告栈的规模
empty() 判断栈是否为空
push(e) 将元素 e 插至栈顶(入栈)
pop() 删除栈顶对象,并返回该对象的引用(出栈)
top() 引用栈顶对象

利用栈的这些操作接口,可以写出代码如下:

#include "Stack.h"/*s:一个栈对象n:将要被转换的十进制数base:进制,若是二进制,则输入 2,若是八进制,则输入 8,以此类推*/
void convert(Stack<char> &s, __int64 n, int base) { //迭代版//0 < n, 1 < base <= 16,新进制下的数位符号,可视 base 取值范围适当扩充static char digit[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };while (n > 0) { //由低到高,逐一计算出新进制下的各数位s.push(digit[n % base]);//余数(当前位)入栈n /= base; //将 n 更新为其对 base 的除商}
}//新进制下由高到低的各数位,自顶而下保存在栈 s 中

本篇文章的代码以及代码中用到的头文件 Stack.h均已上传至 GitHub,点击这里即可获得。

欢迎关注我的微信公众号,扫描下方二维码或微信搜索:AProgrammer,就可以找到我,我会持续为你分享 IT 技术。

「栈」的应用系列之「进制转换」相关推荐

  1. 进制转换数据结构c语言不用栈,急求!!!用数据结构(C语言)利用栈实现十进制向二(八)进制转换,要有注释,谢谢!...

    匿名用户 1级 2013-12-05 回答 #include #include #include typedef unsigned int data_type; //结点数62616964757a68 ...

  2. 使用链栈来对十进制数进行任意进制的转换

    使用辗转相除法,通过链栈来实现一个十进制数字对任意进制的一个转换,提前声明,这里不包括一进制和零进制的转换. #include"stdio.h" #include<stdli ...

  3. java:数据结构(二)栈的应用(进制转换全收集)

    说到进制转换,java已经封装了基本的方法,在竞赛中使用封装的方法自然能节省大量时间 另一位仁兄介绍的封装好的方法: https://blog.csdn.net/m0_37961948/article ...

  4. 数据结构实验之栈与队列一:进制转换

    Description 输入一个十进制非负整数,将其转换成对应的 R (2 <= R <= 9) 进制数,并输出. Input 第一行输入需要转换的十进制非负整数: 第二行输入 R. Ou ...

  5. C语言中用栈实现进制转换,利用栈实现进制转换问题

    进制转换问题 建立顺序栈或链栈,编写程序实现十进制数到二进制数的转换. 输入 输入只有一行,就是十进制整数. 输出 转换后的二进制数. 样例输入 10 样例输出 1010 十进制怎么转为二进制?十进制 ...

  6. 请设计一个栈,实现十进制数转任意进制数。

    文章目录 1.题目描述 2.代码实现 1.题目描述 请设计一个栈,实现十进制数转任意进制数 2.代码实现 #include <iostream> using namespace std;# ...

  7. 数据结构学习笔记:利用栈实现进制转换

    数据结构学习笔记:利用栈实现进制转换 一.除基倒取余法示意图 二.编写十进制转换成二进制Python程序 1.源代码 2.运行结果 其实Python提供了一

  8. 栈的应用(进制转换)

    class Stack:def __init__(self):self.items=[]def isEmpty(self):return self.items==[]def push(self,ite ...

  9. 数据结构实验三 用栈实现进制转换和计算器

    在c++中栈已经有stl容器定义过了,在这里面我就不写栈的定义的那部分了(因为太麻烦了) 进制转换非常简单,尤其是这次只要求了十以内进制的转换,我们只需要先输入要转换的进制t,然后输入要转换的数n,每 ...

最新文章

  1. 解决ros安装 使用roscore命令测试问题
  2. 2008_10_28_星期二
  3. Redhat Linux 7.2 打开或关闭防火墙
  4. Redis集群环境搭建实践
  5. 逆袭进大厂:程序员究竟该如何学好前端?
  6. 分享超级表格用户在知乎上与我们的对话
  7. SVN汉化失败的原因及解决方案(通过SVN官网下载SVN和相应的汉化包)
  8. 使用51单片机驱动航模无刷电机
  9. Matlab实现常见的插值算法
  10. Cloudcompare2.12.2使用vs2022带插件编译以及在WSL中编译cloudCompare【最新实践】
  11. css动画钟表——transform之rotate
  12. dsp28335杂记1
  13. MAC系统下解决Teamviewer 被误认为商业用途的问题
  14. sqlserver 登录名与数据库用户
  15. Herb Sutter简介
  16. 爬虫之爬取英雄联盟战绩详细数据
  17. Oracle入门学习详解
  18. 360图书馆 解除网页防复制
  19. 代码规范 详细解释 husky、prettier、eslint、lint-staged 的作用和使用
  20. maven添加ojdbc6.jar(11g)包

热门文章

  1. 判断闰年,公历转农历完整项目
  2. aardio 谷歌浏览器自动化 (一) 浏览器初始化
  3. jQuery 属性与样式
  4. Hook机制之动态代理
  5. 情人节的4个段子(搞笑情人节短信)
  6. 摆摊经济下小程序为何如此重要?
  7. Unity Android 之 获取系统语言(手机设备设置的系统语言)的二种方式(中文区分简体、繁体、日文)
  8. 什么是aws,云计算?怎么学?
  9. 云存储管理的9个免费工具
  10. 负数在计算机中怎样存储