当前位置: 首页 > news >正文

C++ 进制转换:通用 a 进制转 b 进制(2-36进制)题解

1. 问题分析

本题要求实现一个通用的进制转换器,能够将任意a进制(2 ≤ a ≤ 36)的数转换为b进制(2 ≤ b ≤ 36)的数。输入的数字可能包含字母(a-z 表示 10-35),输出也需要用字母表示大于 9 的数字。

核心思路是采用“以十进制为桥梁”的两步转换法:

  1. a 进制 → 十进制:将输入的 a 进制数按权展开,转换为十进制整数。
  2. 十进制 → b 进制:使用“除 b 取余法”将十进制整数转换为 b 进制数。

2. 算法设计

2.1 a 进制转十进制

遍历输入字符串的每一位:

  • 如果字符是'0'-'9',则其数值为ch - '0'
  • 如果字符是'a'-'z',则其数值为ch - 'a' + 10
  • 如果字符是'A'-'Z',则其数值为ch - 'A' + 10

累加计算:decimal = decimal * a + digit_value

2.2 十进制转 b 进制

使用循环,不断对十进制数进行取模和除法操作:

  • 取余数decimal % b,得到当前最低位的数值。
  • 将余数转换为对应的字符(0-9 或 a-z)。
  • 将结果字符拼接到结果字符串的前面(或最后反转)。
  • 更新decimal = decimal / b,直到decimal为 0。

3. 代码实现

#include<iostream>#include<string>#include<algorithm>// for reverseusingnamespacestd;// 将字符转换为对应的数值intcharToValue(charch){if(ch>='0'&&ch<='9'){returnch-'0';}elseif(ch>='a'&&ch<='z'){returnch-'a'+10;}elseif(ch>='A'&&ch<='Z'){returnch-'A'+10;}return0;// 不会发生}// 将数值转换为对应的字符charvalueToChar(intval){if(val>=0&&val<=9){return'0'+val;}else{return'a'+(val-10);}}intmain(){inta,b;string num;cin>>a>>b;cin>>num;// Step 1: a进制 -> 十进制longlongdecimal=0;// 使用 long long 防止溢出for(charch:num){decimal=decimal*a+charToValue(ch);}// Step 2: 十进制 -> b进制string result="";if(decimal==0){result="0";}else{while(decimal>0){result+=valueToChar(decimal%b);decimal/=b;}reverse(result.begin(),result.end());}cout<<result<<endl;return0;}

4. 代码详解

  • charToValue函数:将字符'0'-'9''a'-'z''A'-'Z'统一转换为对应的整数值(0-35)。
  • valueToChar函数:将整数值(0-35)转换回字符。题目要求输出小写字母,因此这里统一返回小写。
  • 数据类型:使用long long来存储十进制中间结果,因为当 a 进制数位数较多时,十进制值可能超过int范围。
  • 特殊处理:当输入为"0"时,直接输出"0",避免while循环不执行导致结果为空。
  • 结果反转除 b 取余法得到的是从低位到高位的顺序,最后需要用reverse反转得到正确顺序。

5. 测试样例

输入:

16 32 abcdef

计算过程:

  1. abcdef(16进制) =10*16^5 + 11*16^4 + 12*16^3 + 13*16^2 + 14*16^1 + 15*16^0= 11259375 (十进制)
  2. 11259375 转换为 32 进制:
    • 11259375 % 32 = 15 →f
    • 351855 % 32 = 15 →f
    • 10995 % 32 = 19 →j
    • 343 % 32 = 23 →n
    • 10 % 32 = 10 →a
    • 0 % 32 = 0 →0(循环结束)
    • 反转得到:anjff

输出:

anjff

与题目样例完全一致。

6. 总结

本题是进制转换的经典题型,核心在于理解“以十进制为桥梁”的转换思想。代码实现时需要注意:

  1. 字符与数值之间的正确映射。
  2. 使用long long避免整数溢出。
  3. 处理输入为"0"的特殊情况。
  4. 输出结果时注意大小写要求(本题要求小写)。

掌握了这个通用解法,就可以轻松应对 2-36 进制之间的任意转换问题了。

http://www.jsqmd.com/news/871202/

相关文章:

  • Linux系统编程:从文件I/O到目录遍历的实战指南
  • 告别“苹果税“:用Python脚本直连Apple服务器,获取任意macOS版本
  • GCN+Transformer最新1区SCI成果来了,原来只做了这些创新!
  • 终极指南:如何用openpilot开源自动驾驶系统升级你的汽车
  • 25人报考19人缺考,“围岗“的套路比你想的深
  • 2026年内蒙古资产管理数字化解决方案深度指南:从盘点到处置的全链条闭环 - 精选优质企业推荐官
  • 【RDMA内核驱动】ibv_reg_mr(注册内存)源码分析
  • TVBoxOSC:重新定义您的智能电视观影体验
  • 3个步骤掌握Dramatron:终极AI剧本生成器完整指南
  • 戴森球计划工厂蓝图库:3000+专业设计,解决你的太空建造难题
  • 如何永久免费解锁IDM下载管理器:2024终极激活指南
  • 戴森球计划终极蓝图库:3000+专业工厂设计让你秒变太空建造大师
  • 如何用Feishin桌面客户端打造终极自托管音乐播放体验
  • DRAM内存内计算中的位迁移技术解析与应用
  • 2026年5月北京茅台回收怎么选?靠谱高价变现名酒、虫草商家实测 - 博客万
  • 【仅剩最后47份】教育局认证的Claude教育内容创作能力测评题库(含2024秋季新课标适配真题)
  • 3步掌握sd-webui-reactor:Stable Diffusion最强AI换脸插件终极指南
  • 3个技巧快速掌握Bebas Neue:免费商用字体的终极实用指南
  • 3个痛点+5大场景:为什么Markdown Here是技术写作者的效率倍增器
  • 数据库恶意软件防护安装及MySQL审计插件
  • 嵌入式开发学习路线:从硬件基础到RTOS/Linux实战指南
  • 2026年内蒙古资产全生命周期数字化管理解决方案完全指南 - 精选优质企业推荐官
  • 2026年内蒙古资产管理数字化解决方案深度指南:从账实不符到全链条闭环 - 精选优质企业推荐官
  • 告别Cursor试用限制:5步解锁AI编程助手的永久免费使用
  • 如何在300+车型上部署openpilot:免费开源驾驶辅助系统完整指南
  • YOLOv11农产品分拣线番茄目标检测数据集-2452张-Tomato-1_4_2
  • Keep It Simple:自适应代码图简化驱动的高精度漏洞检测框架
  • 戴森球计划工厂蓝图实战:7个关键优化技巧提升自动化效率
  • PIC24F GC系列智能模拟架构解析:16位MCU如何实现高集成度信号链设计
  • ComfyUI自动完成插件:告别提示词拼写烦恼,效率提升300%的秘密武器