任意进制大数转换

问题描述:将用字符串表示的M进制大数,转化为用字符串表示的N进制大数。1<M,N<=62;字符串的取值为[0-9a-zA-Z],例如B表示数字37。

1、受位数限制的方案

关于此问题,最简单的实现方式是先将M进制的大数转化为long long类型的10进制整数,然后再辗转相除求出,N进制的大数字符串。

void reverse(string& srcNum){
    size_t i = 0, j = srcNum.size() - 1;
    char temp = 0;
    while (i < j){
        temp = srcNum[i];
        srcNum[i++] = srcNum[j];
        srcNum[j--] = temp;
    }
}

string m2n_constrait(int srcBase, int desBase, string srcNum){
    if (srcBase > 62 || srcBase < 2 || desBase > 62 || desBase < 2)
        return "";
    char flag[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string desNum;
    long long midNum = 0, temp = 0;
    for (size_t i = 0; i < srcNum.size(); ++i){
        if (srcNum[i] >= '0' && srcNum[i] <= '9')
            temp = srcNum[i] - '0';
        else if (srcNum[i] >= 'a' && srcNum[i] <= 'z')
            temp = srcNum[i] - 'a' + 10;
        else if (srcNum[i] >= 'A' && srcNum[i] <= 'Z')
            temp = srcNum[i] - 'A' + 36;
        else return "";
        midNum = midNum * srcBase + temp;
    }   
    while (midNum){
        desNum.push_back(flag[midNum % desBase]);
        midNum /= desBase;
    }
    reverse(desNum);
    return desNum;
}

2、通用方案

此方案直接对原数据,用目标进制n直接进行辗转相除,取商和取余,逐步求解每一位最终结果。实现起来较为复杂,下面以一个简单的例子来说明其详细过程:要求将32进制的45转化为9进制的数字

  • 判断4是否大于9,不是,所以不进行辗转除
  • 4*32 + 5 = 133,此时大于9, 由于 133 mod 9 = 7, 133 / 9 = 14 (即e);将e转至中间结果
  • 第一轮循环结束,将上一步的余数7存至最终结果,进行下一轮转化(此时转化e)
  • 判断e是否大于9,将e / 9 = 1, e mod 9 = 5;将1存至中间变量
  • 第二轮循环结束,将上一步的余数5存至最终结果,进行下一轮转化(此时转化1)
  • 判断1是否大于9,由于1小于9,不再有中间结果
  • 第三轮循环结束,将上一步的余数1存至最终结果
  • 将最终结果751逆序,得到最终结果157
void reverse(string& srcNum){
    size_t i = 0, j = srcNum.size() - 1;
    char temp = 0;
    while (i < j){
        temp = srcNum[i];
        srcNum[i++] = srcNum[j];
        srcNum[j--] = temp;
    }
}
bool isZero(string& srcNum){
    for (size_t i = 0; i<srcNum.size(); ++i){
        if (srcNum[i] != '0')
            return false;
    }
    return true;
}
string m2n(int srcBase, int desBase, string srcNum){
    if (srcBase > 62 || srcBase < 2 || desBase > 62 || desBase < 2)
        return "";
    char flag[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string desNum, midNum;
    long long temp = 0, carry = 0;
    while (!srcNum.empty() && !isZero(srcNum) ){
        for (size_t i = 0; i < srcNum.size(); ++i){
            if (srcNum[i] >= '0' && srcNum[i] <= '9')
                temp = srcNum[i] - '0';
            else if (srcNum[i] >= 'a' && srcNum[i] <= 'z')
                temp = srcNum[i] - 'a' + 10;
            else if (srcNum[i] >= 'A' && srcNum[i] <= 'Z')
                temp = srcNum[i] - 'A' + 36;
            else return "";
            carry = carry * srcBase + temp;
            if (carry / desBase != 0 || i == srcNum.size() - 1){
                midNum.push_back(flag[carry / desBase]);
                carry %= desBase;
            }
        }
        desNum.push_back(flag[carry]);
        srcNum = midNum;
        carry = 0;
        midNum.clear();
    }
    reverse(desNum);
    return desNum;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容