李宗泰824 2022-12-21 13:07 采纳率: 50%
浏览 9
已结题

c++关于2—16进制的转化

我把我的程序放到这里,它是可以正常运行并输出正确结果的,但是也仅仅是这样,其中我用了很多我自己感觉有些猥琐的方法
因为实在不知道更多可以解决这些问题的办法,望各位指正!


#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int m, n;//m是被转化的数的进制,n是转化成的进制
    string a;//a为要转化的数,为了便于保存abcdef我仅仅想到这一种办法
    cin >> m >> n;
    if (m == 0 && n == 0)
    {
        cout << "停止转换";
        return 0;
    }
    cin >> a;
    int i, sum = 0, j = 0;
    int len1 = a.length();//统计长度,便于用循环转化
    for (i = 0; i < len1; i++)//该循环用于转化为10进制数
    {
        int t;
        if (a[i] >= 97 && a[i] <= 102)
        {
            t = a[i] - 87;//if else把字符串转化为数字
        }
        else t = a[i] - 48;
        sum += t * pow(m, (len1 - 1 - i));
    }//成功转换为10进制sum
    string b(30, 'a');//定义b,储存转化后的数,此处有一个未解决的问题,b如果不赋初值会导致后续无法输出??
    for (i = 0; sum > 0; i++)
    {
        int c = sum % n;
        switch (c)//将每个余数转换为字符串并保存
        {
        case 1:b[i] = '1'; break;
        case 2:b[i] = '2'; break;
        case 3:b[i] = '3'; break;
        case 4:b[i] = '4'; break;
        case 5:b[i] = '5'; break;
        case 6:b[i] = '6'; break;
        case 7:b[i] = '7'; break;
        case 8:b[i] = '8'; break;
        case 9:b[i] = '9'; break;
        case 10:b[i] = 'a'; break;
        case 11:b[i] = 'b'; break;
        case 12:b[i] = 'c'; break;
        case 13:b[i] = 'd'; break;
        case 14:b[i] = 'e'; break;
        case 15:b[i] = 'f'; break;
        }
        sum /= n;
        j++;
    }
    for (int c = j - 1; c >= 0; c--)
    {
        cout << b[c];//输出转化后的数
    }
    return 0;
}
  • 写回答

2条回答 默认 最新

  • ShowMeAI 2022-12-21 13:27
    关注

    望采纳

    • 首先,在将输入的数字转化为10进制数时,可以使用 std::stoi 函数来将字符串转化为整数,而不用使用 if else 语句。例如:

      int num = std::stoi(a, 0, m);
      

      其中,第二个参数 0 表示从字符串的开头开始转化,第三个参数 m 表示输入的数字的进制。

    • 此外,在将10进制数转化为目标进制时,可以使用 std::stringstream 来将数字转化为字符串,而不用使用 switch 语句。例如:

      std::stringstream ss;
      ss << std::uppercase << std::hex << num; // 将 num 转化为十六进制字符串,并转换为大写字母
      std::string result = ss.str();
      

      另外,在输出结果时,可以直接输出字符串 result,而不需要使用反向输出的方法。

    #include <iostream>
    #include <string>
    #include <sstream>
    int main() {
        int m, n;
        std::cin >> m >> n;
        if (m == 0 && n == 0) {
            std::cout << "停止转换";
            return 0;
        }
        std::string a;
        std::cin >> a;
        int num = std::stoi(a, 0, m);
        std::stringstream ss;
        ss << std::uppercase << std::hex << num;
        std::string result = ss.str();
        std::cout << result << std::endl;
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月29日
  • 已采纳回答 12月21日
  • 创建了问题 12月21日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程