编程基础 - 栈的应用 - 进制/数制转换(Numeral Conversion)

【数据结构】栈的应用---数制转换 阅读详情

编程基础 - 栈的应用 - 进制/数制转换(Numeral Conversion)

返回分类:全部文章 >> 基础知识

返回上级:编程基础 - 栈(Stack)



1 数制转换说明

数制转换方面,在另一篇文章( 编程基础 - 进制转换(Binary Conversion) )已经做了详细的解释。

这里将不再重新说明,它使用了栈了原理,但并未使用栈。

在这里,我将使用栈重新编写其中的十进制转其它进制。


2 数制转换(C++ Code)

我们的改动非常有限,只是将结果存入一个栈stack<char>,然后循环打印。

2.1 头文件main.h

#pragma once

#include <vector> // 向量列表
#include <stack> // 栈
#include <unordered_map> // 字典

2.2 主函数文件main.cpp

我们在转换之前,应该先初始化数字到字母的映射(十进制转其它中,char2int并没有用到):

// 初始化双向映射
//      char2int:   字母到数字的映射
//      int2char:   数字到字母的映射
void InitNumeralMapping(unordered_map<char, int> &char2int, unordered_map<int, char> &int2char)
{
    // 初始化数字 0-9
    for (int c = '0', i = 0; c <= '9'; c++, i++)
    {
        char2int[(char)c] = i;
        int2char[i] = (char)c;
    }

    // 初始化字母 a-z
    for (int c = 'a', i = 10; c <= 'z'; c++, i++)
    {
        char2int[(char)c] = i;
        int2char[i] = (char)c;
    }

    // 初始化数字 A-Z
    for (int c = 'A', i = 36; c <= 'Z'; c++, i++)
    {
        char2int[(char)c] = i;
        int2char[i] = (char)c;
    }
}

在转换时,同时存储每一步的结果,这样在打印时可以看到转换过程:

// 转换10进制到其它进制
// params:
//      num:        需要转换的十进制数
//      numeration: (2-62)进制
//      int2char:   十进制数到其它进制的映射
//      steps:      每一步结果[{被除数 : {商 : 余数}}]
//      output:     输出栈
void ConvertDec2Other(long long num, 
                      int numeration, 
                      unordered_map<int, char> int2char,
                      vector<pair<long long, pair<long long, char>>> &steps,
                      stack<char> &output)
{
    if (num == 0)
    {
        output.push('0');
        return;
    }

    //// 10进制可直接用 #include <string> 中的 std::to_string(num)
    //if (numeration == 10)
    //{
    //    string numStr = to_string(num);
    //    for (int i = numStr.length - 1; i >= 0; i--)
    //    {
    //        output.push(numStr[i]);
    //    }
    //    return;
    //}

    long long quotient = num; // 定义商,并初始化为被除数
    int remainder; // 定义余数
    while (quotient != 0)
    {
        pair<long long, pair<long long, int>> step;
        step.first = quotient;

        remainder = quotient % numeration; // 求余数
        output.push(int2char[remainder]); // 将映射放入栈
        quotient = quotient / numeration; // 求商

        step.second = pair<long long, char>(quotient, int2char[remainder]);
        steps.push_back(step);
    }
}

最后,是我们的主函数:

#include "main.h"

#include <iostream>
using namespace std;

constexpr int MIN_NUMERATION = 2; // 常量,最小进制
constexpr int MAX_NUMERATION = 62; // 常量,最大进制

void InitNumeralMapping(unordered_map<char, int> &char2int, unordered_map<int, char> &int2char);
void ConvertDec2Other(long long num,
                      int numeration,
                      unordered_map<int, char> int2char,
                      vector<pair<long long, pair<long long, char>>> &steps,
                      stack<char> &output);

int main()
{
    unordered_map<char, int> char2int; // 字母到数字的映射
    unordered_map<int, char> int2char; // 数字到字母的映射
    InitNumeralMapping(char2int, int2char); // 初始化两个映射

    long long num;
    int numeration;

    while (true)
    {
        cout << "进制转换,依次输入正整数和进制(2-62)(以空格分割):";
        while (!(cin >> num >> numeration) || numeration < MIN_NUMERATION || numeration > MAX_NUMERATION)
        {
                cin.clear();
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cout << "输入不合法,请重新输入:";
        }
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        vector<pair<long long, pair<long long, char>>> steps; // 定义每一步结果
        stack<char> output; // 定义结果栈
        ConvertDec2Other(num, numeration, int2char, steps, output); // 转换进制

        // 打印每一步结果
        cout << "转换过程:" << endl;
        for (int i = 0; i < steps.size(); i++)
        {
            cout << '\t' << (i + 1) << ": ";
            cout << steps[i].first << " / " << numeration << " = ";
            cout << steps[i].second.first << " ... " << steps[i].second.second;
            cout << endl;
        }

        // 打印最终结果
        cout << "转换" << numeration << "进制结果为:";
        while (output.size() > 0)
        {
            cout << output.top();
            output.pop();
        }

        cout << endl << endl;
    }

    system("pause");
    return 0;
}

3.3 运行结果

进制转换,依次输入正整数和进制(2-62)(以空格分割):54263 16
转换过程:
        1: 54263 / 16 = 3391 ... 7
        2: 3391 / 16 = 211 ... f
        3: 211 / 16 = 13 ... 3
        4: 13 / 16 = 0 ... d
转换16进制结果为:d3f7

进制转换,依次输入正整数和进制(2-62)(以空格分割):172537163216 1
输入不合法,请重新输入:3216382736183 62
转换过程:
        1: 3216382736183 / 62 = 51877140906 ... b
        2: 51877140906 / 62 = 836728079 ... 8
        3: 836728079 / 62 = 13495614 ... b
        4: 13495614 / 62 = 217671 ... c
        5: 217671 / 62 = 3510 ... P
        6: 3510 / 62 = 56 ... C
        7: 56 / 62 = 0 ... U
转换62进制结果为:UCPcb8b


4.2 多智能体系统的严格隔离机制:防止上下文污染与隐私数据脱敏实战 本文探讨了多智能体系统中上下文信息共享带来的安全风险与解决方案。研究发现,随着Agent数量增加,上下文信息泄露概率呈指数级上升,可能导致跨Agent错误传播、隐私泄露等问题。文章提出分层隔离架构,将上下文划分为全局共享和本地私有两部分,并通过命名空间隔离、递归压缩和隐私过滤技术确保数据安全。技术实现上,建议为每个子Agent创建独立状态空间,采用原子化更新和读写锁控制避免状态竞争。隐私保护方面,结合正则匹配和命名实体识别技术进行敏感数据过滤,确保符合GDPR等法规要求。这些措施共同构建了可靠、安全且合规的 阅读详情

相关推荐

用 dism 合并与删除 wim 映像

一、合并 假设 installA.wim 有 3 个映像,installB.wim 有 1 个映像。 1、全部合并 将 installA.wim 中的 3 个卷映像合并到 installB.wim 中,这样 installB.wim 中的卷映像增加到 4 个。 dism/export-image/sourceimagefile:d:\installA.wim/sourceindex:1/destinationimagefile:d:\installB.wim dism/export-image/source

KefanWon的博客 5200

【数据结构】2.3栈的应用——进制转换

本文代码为学习总结,如果错误敬请指正!感谢各位大佬 😃 历史文章 线性表 1.1线性表的顺序表示(顺序表) 1.2线性表的链式表示(单链表) 1.3线性表的链式表示(双链表) 1.4线性表的链式表示(循环单链表) 1.5线性表的链式表示(循环双链表) 栈、队列和数组 2.1顺序栈 2.2链栈 文章目录栈的定义进制转换完整代码及运行结果代码运行结果 栈的定义 只允许在一端进行插入或删除操作的线性表 栈的操作特性:后进先出(LIFO) 进制转换 void conversion(int n,i.

技术小白 3658

基于aarch64分析kernel源码 六:kernel_init进程(1号进程)、kthreadd进程(2号进程)

kernel_init进程(1号进程)、kthreadd进程(2号进程)分析

OnlyLove_的博客 764

栈的应用之进制转换

一、十进制转十六进制 输入任意一个非负十进制整数,打印输出与其等值的十六进制数。例如计算654321的十六进制 package p2.线性结构; //十进制 转 十六进制 public class DecToHex { public static void main(String[] args) { int num=654321; ArrayStack<String> stack=new ArrayStack<>(); w

m0_58679504的博客 4799

Python实现将pdf,docx,xls,doc,wps,zip,xlsx,ofd链接下载并将文件保存到本地

本文是该专栏的第31篇,后面会持续分享python的各种干货知识,值得关注。在工作上,尤其是在处理爬虫项目中,会遇到这样的需求。访问某个网页或者在采集某个页面的时候,正文部分含有docx,或pdf,或xls,或doc,或wps等链接。需要你使用python自动将页面上含有的这些信息链接下载并保存到指定文件夹。遇到这种情况需要怎么做呢?别担心,跟着笔者直接往下看正文的详细解决方法。(附完整代码)在有些网页的正文中,有时会有如下图中的doc链接。比如爬虫在采集正文数据的时候,像标题,正文内容,作者,发布时间等等

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 4146

【NI Multisim 14.0编辑环境——项目管理器】

主窗口包括标题栏、菜单栏、工具栏、工作区域、电子表格视图(信息窗口)、状态栏及项目管理器7个部分。 上期我们了解了工具栏,今天我们继续了解项目管理器。 一、项目管理器 在原理图设计中经常用到的工作面板有“设计工具箱”面板、“SPICE网表查看器”面板及“LabVIEW 协同仿真终端”面板。 1.“设计工具箱”面板 基本位于工作界面左侧,主要用于层次电路的显示。启动软件,默认创建的“设计1”以分层的形式显示出来。 那么如何打开“设计工具箱”面板呢?如图所示:在该面板中显示 SPICE 网表的输入,输出

RL2698853114的博客 2036

利用栈实现进制转换

利用栈实现的进制转化

weixin_52778075的博客 1万+

【论文汇总】Diffusion Models视频生成/视频编辑/可控视频生成/跨模态视频生成

本文总结了Diffusion Models视频生成领域相关的工作,目前共收录142篇,持续更新中。

沉迷单车的追风少年 1673

数据结构-栈的运用-数的进制转换

有关进制转换的四种方法 没听错 粗略是三种,看完后一定会有很大的收获的

m0_61196970的博客 5187

agent实战专栏|日程管理Agent:智能时间管家

在快节奏的现代生活中,时间管理已成为每个人面临的核心挑战。根据全球知名调研机构 Gallup 的统计数据,现代职场人平均每天仅能有效专注工作 2 小时 23 分钟,剩余时间被会议、邮件、碎片化事务大量占据。微软的另一项研究显示,知识工作者平均每天需要处理 200 多条日程相关的信息,包括会议邀请、日历变更、提醒通知等。传统的日历工具(如 Google Calendar、Outlook Calendar、Apple Calendar)虽然在可视化展示和基础提醒方面表现出色,但在智能化方面仍存在明显短板:日程管

2201_76125393的博客 52

MIPI D-PHY TX 一致性测试实例解析 Part 03

本文之前,已经讨论了MIPI D-PHY TX的1.3.x和1.4.x的测试项,1.5.x的测试项相对较少,主要是用于时钟和数据通道相关的时序测量

一只豌豆象的博客 5186

进制的转换(栈的应用)

将十进制数N和其他d进制数之间进行转换是计算机实现计算的基本问题,解决方案很多,其中最简单的方法是除d取余法。例如,(1348)10=(2504)8,其转化过程如下所示: N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0

q1430186623的博客 3988

LVGL core group焦点分组管理(lv_group.c)

lv_group_t是用于焦点管理的,将需要获取焦点的对像加入到同一个分组内,再将其通过挂到指定的事件驱动中,就可以控制焦点了。而被加入的对象又可以通过焦点状态事件和事件来控制对象的焦点逻辑了。创建好的分组通过接口挂事件驱动中,这样就可以指定一个自定义的焦点分组了。;) {if(!} }友情提示:无论是接口还是都是单例的,即被设置后前一个被设置的值就失效了;此方案可以保证焦点的唯一 性,但也一定要记住要在适合的位置设置回来,以防丢失焦点。

Bigan(安)的博客 3909

数据结构:栈的应用举例——进制转换

栈的应用举例

计算机科学、人工智能、数据分析和大数据方向的研发和教学。 1405

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

栈——实现进制转换

一、顺序栈基本函数 #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> #define max 50 typedef char Datatype; typedef struct s { Datatype* data; int top; }Stack; Stack* InitStack() { Stack* s=(Stack*)m

weixin_63623921的博客 5656

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【数据结构】【C语言】 栈的应用之进制转换

进制转换使用的方法是短除法 短除法图示: 原理: 图中9是待转换数,将9与2相除,得到的余数依次入栈,当待转换数9被除为0时,将栈中的余数依次出栈,即得到9的二进制形式:1001 代码示例: #include<stdio.h> #include<stdlib.h> #define MAXSTACK 50 //栈的最大容量 //结构体的定义——>栈的属性 struct myStack { int* stackMemory; //以栈中存储的数据是整数为例 i.

Mr_VK的博客 5327

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据结构作业:栈的应用:进制转换

进制转换--栈操作

wzc200406的博客 351

使用顺序栈实现进制转化

顺序栈实现进制转化

weixin_64158899的博客 764

用栈实现进制转换:C++代码详解

在计算机科学中,进制转换是一个非常基础且常用的操作,无论是在日常开发还是在算法竞赛中都有广泛的应用。通常,我们会使用栈这一数据结构来辅助进制转换,因为栈的“后进先出”(LIFO)特性与进制转换的需求完美契合。具体来说,在进制转换的过程中,我们会将每次计算得到的余数压入栈中,最后再依次弹出栈内元素,从而得到正确的转换结果。在实际开发中,我们还可以加入更多的错误处理逻辑,例如检查输入是否为有效数字,或者在栈操作时进行异常处理。而空间复杂度则与栈的大小有关,在最坏情况下,栈中会存储。的余数,并将结果压入栈中。

qq_22841387的博客 706

利用栈数据结构实现数进制转换

利用栈数据结构实现数进制转换

wang1664178416的博客 1032

数据结构——利用栈来实现进制转换

【代码】数据结构——利用栈来实现进制转换。

m0_73417372的博客 6146

[数据结构] 栈的应用(进制转换)

案例来自慕课网https://www.imooc.com/u/1349694/courses?sort=publish 十进制转换其他进制使用的是短除法:不停将原数除以进制,保留余数;然后商继续除以进制保留余数,直到商为0。再将余数从倒写即可得到进制转化。 如上图,对于十进制数1348,进行除8取余,将每次的余数 4 0 5 2 入栈,然后从栈顶开始打印。即可得到八进制数为2504。 接下来是代...

qq_43145072的博客 722

栈的数制转换

void conversion(stack &s,int n,int m) {//n为输入的十进制的数,m为要转化的进制。4.栈s的top指针指向的是栈顶元素的上一个数,所以 e = *--s.top;//e没有初始化就对它赋值,将其初始化为0;3.在conversion函数中对pop函数调用时,要对e初始化,比如e=0;printf("转化后的数为:%d\n", e);2.判断一个栈是否为空时,只用判断栈顶指针和栈低指针是否相等。//删除栈顶元素,用e返回值。//判断一个栈是否为空。

DNAXNA的博客 577

数据结构--栈(栈的应用)

逆波兰式的求值:把数字字符直接入栈,直至+-*/要入栈时把栈顶的两个数字字符进行待入栈的运算后把运算完的值再进栈。二.逆波兰表达式(中缀转换后缀并求后缀表达式的值)一.用栈实现进制转换。

m0_74955132的博客 539

进制转换之栈

算法如下: 第一步:将num取余base的值入栈 第二步,将num的值变成num/base的整数部分 第三步:重复第一步和第二步,直到num=0 第四步:将栈内元素逐个出栈,用一个空字符串将其加起来,由于栈的特点是后进先出(LIFO),所以这时我们就得到了转换后的数值(如果想拿到数值,可以通过(parseInt(converted))来获得 这个方法只能用来转换base在2-9的情况

m0_67522355的博客 358

第4章栈和队列:栈的应用——进制转换

本文介绍了栈在进制转换中的应用。通过"除余法"可将十进制整数转换为其他进制,利用栈的"后进先出"特性存储余数,最后依次出栈得到转换结果。以十进制转二进制为例,详细说明了算法步骤、实现代码和时间空间复杂度分析,时间复杂度为O(log₂N),空间复杂度为O(log₂N)。该方法可推广到其他进制转换,如八进制、十六进制等,具有普遍适用性。

计算机科学、人工智能、数据分析和大数据方向的研发和教学。 875
上一篇: 编程基础 - 栈的应用 - 混洗(Stack Shuffling)
下一篇: 编程基础 - 栈的应用 - 行编辑问题(Line Editing)
沙沙的兔子
博客等级 码龄17年 359粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值