c++: 五、八、十、十二、十六进制数之间相互转换

1.输出操作菜单:
A. 5进制数---> 8进制数
B. 5进制数---> 10进制数
C. 5进制数---> 12进制数
D. 5进制数---> 16进制数
E. 8进制数---> 5进制数
F. 8进制数---> 10进制数
G. 8进制数---> 12进制数
……
0.退出


// g++ -Wall -std=c++17 main.cpp

#include <iostream>
#include <tuple>
#include <vector>

int to_int(const std::string &s, int b)
{
    int n = 0;
    for (auto c : s)
        n = n * b + c - '0';
    return n;
}

std::string to_string(int n, int b)
{
    const char *c = "0123456789ABCDEF";
    std::string s;
    do
    {
        auto m = n % b;
        s.push_back(c[m]);
        n /= b;
    } while (n != 0);
    return std::string(s.rbegin(), s.rend());
}

int main()
{
    auto bases = {5, 8, 10, 12, 16};
    std::vector<std::tuple<int, int>> conversions;
    for (auto src : bases)
    {
        for (auto tar : bases)
        {
            if (src == tar)
                continue;
            conversions.push_back({src, tar});
        }
    }
    while (1)
    {
        int index = 0;
        for (auto [src, tar] : conversions)
        {
            std::cout << static_cast<char>('A' + index) << ". " << src << "进制数 ---> " << tar << "进制数\n";
            index++;
        }
        std::cout << "0. 退出\n";
        printf("输入选项: ");
        char ch;
        std::cin >> ch;
        if (ch == '0')
            break;
        index = ch - 'A';
        auto [src, tar] = conversions[index];
        std::cout << "输入" << src << "进制数: ";
        std::string string;
        std::cin >> string;
        int num = to_int(string, src);
        std::cout << "转换为" << tar << "进制数结果是: " << to_string(num, tar) << std::endl;
    }
    return 0;
}