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

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


#include
#include
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;
}

望采纳

  • 首先,在将输入的数字转化为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;
}