【牛客网】进制转换(2~36)

来源:互联网 发布:无线连接投影仪软件 编辑:程序博客网 时间:2024/06/10 16:06

本代码中M表示原始进制,N表示目标进制,大数处理的C++实现,M和N均[2,36]

#include<iostream>#include<cstdio>#include<cstring>#include<map>using namespace std;const int maxM = 36;    // 最大进制数 '0'-'9' + 'a'-'z' 共 36 种const int maxn = 10000;int M = 2;      // 原始进制int N = 2;      // 目标进制string str;     // 存储输入// 所有数组 0 号元素均表示数组长度int dr[maxn];       // 存储由字符串转过来的大数int drans[maxn];    // 求余过程中的商int drres[maxn];    // 余数map<char, int> mci; // 字符与数字对应的mapmap<int, char> mic; // 数字与字符对应的map// 字符与数值对应map初始化void initialization(){    // 字符与数字对应的map构建    for(int i = 0; i < maxM; ++i)    {        if(i < 10)        {            // '0' - '9'            mci['0'+i] = i;            mic[i] = '0'+i;        }        else        {            // 'a' - 'z'            mci['a'+i-10] = i;            mic[i] = 'a'+i-10;        }    }}// 判断是否是大写字母int isCapital(char ch){    if(ch >= 'A' && ch <= 'Z')    {        return 1;    }    else    {        return 0;    }}// 字符串预处理,并给存储原始进制的数组赋值void pretreatment(){    // 将所有大写字母转换成小写    for(int i = 0; i < str.length(); ++i)    {        // 大写字母转小写        if(isCapital(str[i]) == 1)        {            str[i] = 'a' + str[i] - 'A';        }    }    // 给存储原始进制的数组赋值    memset(dr, 0, sizeof(dr));    for(int i = 0; i < str.length(); ++i)    {        dr[++dr[0]] = mci[str[i]];    }}// 将 M 进制的 dr 转换成 N 进制void solve(){    memset(drres, 0, sizeof(drres));    int i, j, y;    // 模 n 取余法,(总体规律是先余为低位,后余为高位)    while(dr[0] >= 1)    {        // 只要被除数仍然 >= 1,则继续操作        y = 0;        i = 1;        drans[0] = dr[0];       // 商的长度与被除数相同(包含前导0)        while(i <= dr[0])        {            y = y * M + dr[i];            drans[i++] = y / N;            y %= N;        }        drres[++drres[0]] = y;  // 本轮计算得到的余数        i = 1;        // 找到下一轮商的起始位置        while((i<=drans[0]) && (drans[i] == 0)) ++i;        // 清除这一轮使用的被除数        memset(dr, 0, sizeof(dr));        // 本轮得到的商为下一轮的被除数        for(j = i; j <= drans[0]; ++j)        {            dr[++dr[0]] = drans[j];        }        // 清除本轮的商        memset(drans, 0, sizeof(drans));    }}// 输出 N 进制的结果void output(){    for(int i = drres[0]; i >= 1; --i)    {        cout << mic[drres[i]];    }}int main(){    initialization();   // 字符与数值对应的map的构建    while(cin >> M >> N)    {        cin >> str;        pretreatment();     // 预处理字符串,并给存储原始进制的数组赋值        solve();            // 将 M 进制的 dr 转换成 N 进制        output();           // 输出 N 进制的结果        cout << endl;    }    return 0;}
1 0
原创粉丝点击