任意進制大數(shù)轉(zhuǎn)換

問題描述:將用字符串表示的M進制大數(shù),轉(zhuǎn)化為用字符串表示的N進制大數(shù)讼积。1<M,N<=62;字符串的取值為[0-9a-zA-Z]沐祷,例如B表示數(shù)字37。

1纵寝、受位數(shù)限制的方案

關(guān)于此問題论寨,最簡單的實現(xiàn)方式是先將M進制的大數(shù)轉(zhuǎn)化為long long類型的10進制整數(shù),然后再輾轉(zhuǎn)相除求出爽茴,N進制的大數(shù)字符串葬凳。

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、通用方案

此方案直接對原數(shù)據(jù)室奏,用目標進制n直接進行輾轉(zhuǎn)相除火焰,取商和取余,逐步求解每一位最終結(jié)果胧沫。實現(xiàn)起來較為復(fù)雜昌简,下面以一個簡單的例子來說明其詳細過程:要求將32進制的45轉(zhuǎn)化為9進制的數(shù)字

  • 判斷4是否大于9,不是绒怨,所以不進行輾轉(zhuǎn)除
  • 4*32 + 5 = 133纯赎,此時大于9, 由于 133 mod 9 = 7, 133 / 9 = 14 (即e)南蹂;將e轉(zhuǎn)至中間結(jié)果
  • 第一輪循環(huán)結(jié)束犬金,將上一步的余數(shù)7存至最終結(jié)果,進行下一輪轉(zhuǎn)化(此時轉(zhuǎn)化e)
  • 判斷e是否大于9,將e / 9 = 1晚顷, e mod 9 = 5峰伙;將1存至中間變量
  • 第二輪循環(huán)結(jié)束,將上一步的余數(shù)5存至最終結(jié)果该默,進行下一輪轉(zhuǎn)化(此時轉(zhuǎn)化1)
  • 判斷1是否大于9瞳氓,由于1小于9,不再有中間結(jié)果
  • 第三輪循環(huán)結(jié)束栓袖,將上一步的余數(shù)1存至最終結(jié)果
  • 將最終結(jié)果751逆序顿膨,得到最終結(jié)果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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叽赊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌必搞,老刑警劉巖必指,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恕洲,居然都是意外死亡塔橡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門霜第,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葛家,“玉大人,你說我怎么就攤上這事泌类●耍” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵刃榨,是天一觀的道長弹砚。 經(jīng)常有香客問我,道長枢希,這世上最難降的妖魔是什么桌吃? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮苞轿,結(jié)果婚禮上茅诱,老公的妹妹穿的比我還像新娘。我一直安慰自己搬卒,他們只是感情好瑟俭,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秀睛,像睡著了一般尔当。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天椭迎,我揣著相機與錄音锐帜,去河邊找鬼。 笑死畜号,一個胖子當(dāng)著我的面吹牛缴阎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播简软,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蛮拔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痹升?” 一聲冷哼從身側(cè)響起建炫,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疼蛾,沒想到半個月后肛跌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡察郁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年衍慎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皮钠。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡稳捆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麦轰,到底是詐尸還是另有隱情乔夯,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布款侵,位于F島的核電站驯嘱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏喳坠。R本人自食惡果不足惜鞠评,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壕鹉。 院中可真熱鬧剃幌,春花似錦、人聲如沸晾浴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脊凰。三九已至抖棘,卻和暖如春茂腥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背切省。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工最岗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朝捆。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓般渡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芙盘。 傳聞我的和親對象是個殘疾皇子驯用,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 關(guān)鍵字 1.1 關(guān)鍵字的概述 Java的關(guān)鍵字對java的編譯器有特殊的意義,他們用來表示一種數(shù)據(jù)類型儒老,或...
    哈哈哎呦喂閱讀 652評論 0 0
  • 仰頭行走在夜空下蝴乔!孤獨的背影,受傷的心驮樊。結(jié)束了將近7年的愛情淘这,倒也是叛逆的早戀,初2開始巩剖,大2結(jié)束,這段愛情的長途...
    FXQ閱讀 207評論 0 0
  • 90天的踐行這么快就結(jié)束了钠怯,感覺還有好多事情沒有做好佳魔,之前感覺一個很簡單的三個目標,覺得很有信心完成晦炊,實際做起來還...
    羅月君閱讀 395評論 1 5
  • 首先畫畫一定要先想好整體構(gòu)架鞠鲜,原來頭發(fā)也是畫的美美噠,但是畫臉型的時候有改主意畫萌萌的断国,然后整體改設(shè)定贤姆。 最后才發(fā)...
    panda每天變好一點點閱讀 804評論 0 2