"蓝桥杯“基础练习:十六进制转八进制

2023-10-28

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

心得:

题目有些难度,一开始想的是把16进制先转化为10进制,因为从10进制转化为8进制很容易。但是题目中输入的16进制位数规模大,不超过100000位,肯定不能化为10进制数。解法是先把16进制化为四个2进制数,然后三个二进制数一组再化为8进制。 注意 39(16进制)--〉0011    1001   (2进制) --〉111  001(8进制),是从二进制的低位开始三个一组来计算。

代码:

#include <iostream>
#include <string.h>
#include <stack>
using namespace std;

int fib(int n)//计算2的多少次方
{
    int sum=1;
    if(n==0)
        return 1;
    else
    {
        for(int i=1;i<=n;i++)
            sum*=2;
        return sum;
    }
}

string str[11];

int two[400008];//因为16进制的位数不超过100000,所以换成二进制数位数不超过400000

int main()
{
    int n,i,j,k;
    cin>>n;
    for(int k=1;k<=n;++k)
    {
        cin>>str[k];
        memset(two,0,sizeof(two));
        for( i=0;i<str[k].length();++i)//把十六进制的每一位变成4个二进制数,注意存放的顺序
        {
            if(str[k][i]>='0'&&str[k][i]<='9')
            {
                int temp=str[k][i]-'0';
                int tap=4*(i+1);//把two数组每4个元素为一组,连续,当前的十六进制位为two数组的最大下标+1
                while(temp)
                {
                    two[--tap]=temp%2;//首先要tap-1,因为two数组是从0开始的,这也解释了为什么上面说是最大下标+1
                    temp/=2;
                }
            }
            else
            {
                int temp=str[k][i]-55;//A-55得10
                int tap=4*(i+1);
                while(temp)
                {
                    two[--tap]=temp%2;
                    temp/=2;
                }
            }
        }//到目前为止把16进制转成了二进制
        int count=0;//二进制数三位一组来转化为8进制
        int sum=0;//连续三位二进制数的值
        stack<int>q;
        for(j=4*str[k].length()-1;j>=0;--j)//从two数组的存数的最大下标开始处理,每三个为一组,转化为8进制,保存在栈中
        {
            sum+=(two[j]*fib(count++));
            if(count==3)
            {
                q.push(sum);
                sum=0;
                count=0;
            }

        }
        int sum1=0;//考虑处理的末尾,可能最后一组少于3个,有可能是一个,也可能是两个,单独处理,单独输出
        int c=0;
        for(int m=4*str[k].length()%3-1;m>=0;--m)//4*str[k].length()%3判断还剩下几个
        {
            sum1+=two[c++]*fib(m);
        }
        if(sum1!=0)
            cout<<sum1;//单独输出
        if(q.top()==0)
            q.pop();//去除前导0,如果有的话
        while(!q.empty())
        {
           cout<<q.top();//从栈中输出
            q.pop();
        }
        cout<<endl;
    }
    return 0;
}

运行:


2014.3.4日修改

上面写的代码太复杂了,看到同学写的该题,受到了启发。十六进制转二进制不用上面代码那么麻烦。

另一种解法如下:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int n;
    cin>>n;
    for(int k=1;k<=n;k++)
    {
        string s1,s2;//s1为输入的原始的十六进制串,s2为转化成的二进制串
        cin>>s1;
        s2="";//初始化
        for(int i=0;i<s1.length();i++)//遍历,字符串上加上每一位
        {
            switch(s1[i])
            {
                case '0':s2+="0000";break;
                case '1':s2+="0001";break;
                case '2':s2+="0010";break;
                case '3':s2+="0011";break;
                case '4':s2+="0100";break;
                case '5':s2+="0101";break;
                case '6':s2+="0110";break;
                case '7':s2+="0111";break;
                case '8':s2+="1000";break;
                case '9':s2+="1001";break;
                case 'A':s2+="1010";break;
                case 'B':s2+="1011";break;
                case 'C':s2+="1100";break;
                case 'D':s2+="1101";break;
                case 'E':s2+="1110";break;
                case 'F':s2+="1111";break;
                default:break;
            }
        }
        int len=s2.length();

        if(len%3==1)//三个二进制为一位八进制,二进制串前面补0,确保二进制串的长度为3的倍数
            s2="00"+s2;
        else if(len%3==2)
            s2="0"+s2;
        int flag=0;
        for(int i=0;i<=s2.length()-3;i+=3)
        {
            int num=4*(s2[i]-'0')+2*(s2[i+1]-'0')+(s2[i+2]-'0');
            if(num)
                flag=1;//忽略前导0
            if(flag)
                cout<<num;
        }
        cout<<endl;
    }
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

"蓝桥杯“基础练习:十六进制转八进制 的相关文章

  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 将数组从 C# 编组到 C++ 并返回:PInvokeStackImbalance

    我有一个 C 函数 我想从 C 访问它 问题是我不断收到 PInvokeStackImbalance 异常 但我不知道为什么 当检查异常被关闭时 一切都运行良好并且符合预期 我的 C 函数的签名是 extern C double solve
  • 用 C++ 解密文件,该文件使用 openssl -aes-128-cbc 加密

    我正在尝试用 C 解密文件 该文件使用以下命令加密 openssl enc nosalt aes 128 cbc pass pass test in test txt out test enc txt p 控制台显示key 098F6BCD
  • 在 C 程序中追踪数组越界访问/写入的推荐方法

    考虑用 C 语言编写一些不太明显的算法的实现 例如 让它成为递归快速排序 我在 K N King 的 C 编程 现代方法 第二版 书中找到了它 可以从here http knking com books c2 programs qsort
  • 使用 Thread.Sleep() 时,异步编程如何与线程一起工作?

    假设 前言 在之前的问题中 我们注意到Thread Sleep阻塞线程参见 什么时候使用Task Delay 什么时候使用Thread Sleep https stackoverflow com questions 20082221 whe
  • c++11 中的 std::thread 问题

    我在尝试从标准模板库编译具有多线程的程序时遇到一些麻烦 当我尝试编译以下程序时 它返回一个晦涩的错误 include
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • Boost async_write问题

    我将展示一些代码 void wh const boost system error code ec std size t bytes transferred std cout lt lt test int main int argc cha
  • 如何使用 Caliburn.Micro MVVM 将焦点设置到控件

    我有一个表单 我想在发生某些用户操作时将焦点设置到文本框 我知道 MVVM 的处理方式是绑定到 VM 属性 但是 TextBox 没有允许这种情况发生的属性 从虚拟机设置焦点的最佳方法是什么 我创建了一个 IResult 实现 可以很好地实
  • Parallel.For 和 Break() 误解?

    我正在研究 For 循环中的并行性中断 看完之后this http tipsandtricks runicsoft com CSharp ParallelClass html and this http reedcopsey com 201
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • 读取所有进程内存以查找字符串变量c#的地址

    我有 2 个用 C 编写的程序 第一个名为 ScanMe 的程序包含一个包含值 FINDMEEEEEEE 的字符串变量 以及一个值为 1546 22915487 的双精度变量 另一个名为 MemoryScan 的程序读取第一个程序的所有内存
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • 当另一个进程使用 std::fstream 写入文件时从文件读取[重复]

    这个问题在这里已经有答案了 我需要从文件中逐行读取 它是由 std getline 完成的 另一个进程的问题是一直向其附加数据 然后我需要读取新行 例如 文件一开始包含10行 我的程序读取了10行 那么我的程序应该等待 过了一会儿 另一个进
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He

随机推荐

  • python DataFrame获取行数、列数、索引及第几行第几列的值

    1 df DataFrame A 11 B 12 A 111 B 121 A 1111 B 1211 print df columns size 列数 2 print df iloc 0 size 行数 3 print df ix 0 in
  • 获取x-sign/x-mini-wua/x-sgext/x-umt

    文章目录 获取x sign x mini wua x sgext x umt 获取应用上下文 获取Mtop 获取MtopConfig 从MtopConfig获得sign对象 创建参数并调用 获取x sign x mini wua x sge
  • Redis第十二讲 Redis之zset底层数据结构实现

    zset zset中的每个元素包含数据本身和一个对应的分数 score ZSet 为有序的 自动去重的集合数据类型 ZSet 数据结构底层实现为 ziplist 或跳表 skiplist zset的数据本身不允许重复 但是score允许重复
  • 【报错】No module named ‘imutils‘

    1 No module named imutils imutils是整合了opencv numpy和matplotlib的相关操作的一个python工具包 主要是用来进行图形图像的处理等等 后又加入了针对视频的处理等 imutils同时支持
  • 从零实现DevOps(一):Centos7安装gitlab详解

    从今日起 开始更新 从零实现DevOps 系列 内容丰富且完整 预计内容包括Gitlab安装 环境变量配置 Jenkins安装和配置 本地 远程 部署单体项目 本地 远程 部署Vue项目 本地 远程 部署微服务项目等 希望能帮助大家 在技术
  • 物美智能系统

    物美智能系统 项目介绍 物美智能 wumei smart 是一个简单易用的生活物联网平台 可用于搭建物联网平台以及二次开发和学习 设备接入使用EMQX消息服务器 加密认证 后端采用Spring boot 前端采用Vue 移动端采用Uniap
  • VBA-读取文件的几种方法用时对比

    不同方法的其他优劣可以参考其余文档 本文仅对比用时 并且由于文件以其他方式读取过会影响下次读取速度 本次结果仅供参考 本人小白 欢迎指正 方法 用时 s 备注 workbook open 0 14 0 39 execut Excel 1 5
  • R语言生存数据进行中介分析(2)--手动推导cox回归中介分析

    中介变量 mediator 是一个重要的统计概念 如果自变量 X 通过某一变量 M 对因变量 Y 产生一定影响 则称 M 为 X 和 Y 的中介变量 目前国内外研究大部分都借鉴因果逐步回归法检验 因果步骤法由 Baron 和 Kenny 1
  • STM32L051测试 (三、I2C协议设备的添加测试)

    前面两篇文章 把L051基本功能都测试过了 确实感觉到ST的CubeMX工具真是好用 对应换芯片的应用来说 着实方便 底层库封装好 上层应用程序基本都一样 今天我们就来把 I2C 设备添加一下 今天正好借这个机会 把I2C的代码优化一下 目
  • SQLite步骤

    C 使用SQLite步骤及示例 1 下载sqlite文件 下载网址 http www sqlite org download html SQLite版本为SQLite 3 11 1 相关文件如下 sqlite dll win32 x86 3
  • Tx-Lcn 5.2 源码打包并上传到nexus私服

    Tx Lcn源码打包并上传到nexus私服 第一步 maven修改setting文件 添加nexus登录用户
  • 深入理解JVM(3)——7种垃圾收集器

    转载自深入理解JVM 3 7种垃圾收集器 如果说收集算法是内存回收的方法论 那么垃圾收集器就是内存回收的具体实现 Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定 因此不同的厂商 版本的虚拟机所提供的垃圾收集器都可能会有很大差别
  • 足球- EDA的历史数据分析并可视化

    足球 EDA的历史数据分析并可视化 背景 数据介绍 探索数据时需要遵循的一些方向 数据处理 导入库 数据探索 数据可视化 赛事分析 主客场比分 相关性分析 时间序列分析 总结 背景 该数据集包括从1872年第一场正式比赛到2023年的44
  • springboot项目中双数据源的配置

    springboot项目中双数据源的配置 对于一个项目中我们可能会配置多个数据源的情况 因而在这里向大家具体的介绍下如何在项目中配置多个数据源 比如我们配置一个EHR数据源和一个YSJ数据源 1 pom文件中引入德鲁伊 druid 的依赖
  • 钢铁打工人的自我修养,成为一名合格的打工人,自己的工资自己算。(2020年度个人所得税算法)

    钢铁打工人的自我修养 自己的工资自己算 怎么算 该补还出是该退 退 补 问题的产生 补税情况 你要交钱 税务局根据你的公司在6月份给你 上报的薪资 来确定你将来12个月内的税率 所以如果在6月份后 你张工资了 应该增加税率 多扣你的税 但是
  • C++学习之旅 第一章 C++预备知识

    目录 一 CPU 主板 内存条 硬盘 显示器 显卡 之间的关系 二 Hallo world如何被启动 三 数据类型 四 变量和常量 五 进制 1 首先 cpu相当于人类的大脑 显卡相当于翻译工具 把编码翻译成文字 用户通过显示器来观看 内存
  • 质数练习:比如输入的数字为100,求100 以内的质数的个数(除了1和本身都除不尽)

    const getPrimeNumber chang number gt let num 0 for let i 2 i lt chang i if i 2 i 3 i 5 i 7 num else if i 2 0 i 3 0 i 5 0
  • 华为OD机试 - 九宫格按键输入(Java)

    题目描述 九宫格按键输入 输出显示内容 有英文和数字两个模式 默认是数字模式 数字模式直接输出数字 英文模式连续按同一个按键会依次出现这个按键上的字母 如果输入 或者其他字符 则循环中断 字符对应关系如图 要求输入一串按键 输出屏幕显示 输
  • iframe页面嵌套问题提示X-Frame-Options问题

    背景 有一个页面需要被嵌入到另外一个系统中发现嵌入不进去 浏览器控制台提示报错 Refused to display http 10 45 80 3 portal iframe html in a frame because it set
  • "蓝桥杯“基础练习:十六进制转八进制

    问题描述 给定n个十六进制正整数 输出它们对应的八进制数 输入格式 输入的第一行为一个正整数n 1 lt n lt 10 接下来n行 每行一个由0 9 大写字母A F组成的字符串 表示要转换的十六进制正整数 每个十六进制数长度不超过1000