整数的N进制字符串表示

发布于:2024-11-29 ⋅ 阅读:(21) ⋅ 点赞:(0)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

//函数声明,用于将整数n转换为以b为基的字符串
string itob(int n, int b);

int main()
{
    //用于存储从控制台输入的整数n
    int n;
    //用于存储从控制台输入的进制数b
    int b;
    //用于存储转换后的字符串结果
    string s;

    //从控制台读取整数n和进制数b,以空格分隔
    cin >> n >> b;

    //调用itob函数进行进制转换,将结果存储到s中
    s = itob(n, b);

    //将转换后的字符串输出到控制台
    cout << s;

    return 0;
}

string itob(int n, int b)
{
    //用于存储每次计算得到的余数
    int num;
    //定义一个向量,用于存储转换过程中得到的字符,最终将构成转换后的字符串
    vector<char> A;
    //用于标记输入的整数n是否为负数,初始化为false
    bool isN = false;

    //判断输入的整数n是否为负数
    if (n < 0)
    {
        //如果n是负数,将isN标记为true
        isN = true;
        //将n取绝对值,以便后续正常进行进制转换操作
        n = -n;
    }

    //处理n为0的特殊情况,若n为0,直接返回字符串"0"
    if (n == 0)
        return "0";

    //定义用于转换数字为字符的字符数组
    //其中包含了0-9以及a-z的字符,可用于表示不同进制下的数字字符
    const char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";

    //当n大于0时,进行进制转换的循环操作
    while (n > 0)
    {
        //计算n除以b的余数,该余数将对应转换后的字符在digits数组中的索引
        num = n % b;
        //更新n的值,为下一次循环做准备,即n除以b的商
        n = n / b;
        //根据计算得到的余数num,从digits数组中获取对应的字符,并添加到向量A中
        A.push_back(digits[num]);
    }

    //如果原数n是负数,在生成的字符串前添加负号
    if (isN)
        A.push_back('-');

    //反转结果向量A,因为在循环中是从低位到高位得到字符的,反转后可得到从高位到低位的正确顺序
    reverse(A.begin(), A.end());

    //将结果向量A转换为字符串,以便返回最终的转换结果
    string Astr(A.begin(), A.end());

    return Astr;
}