大數(shù)乘法問(wèn)題(C++版)

近日參加一個(gè)筆試,遇到大數(shù)乘法問(wèn)題舒裤,這是一個(gè)經(jīng)典的算法題队塘。所謂大數(shù)乘法問(wèn)題其實(shí)就是這樣的:輸入兩個(gè)整數(shù),要求輸出這兩個(gè)數(shù)的乘積宜鸯。輸入的數(shù)字可能超過(guò)計(jì)算機(jī)內(nèi)任何數(shù)據(jù)的存儲(chǔ)范圍憔古。這里主要需要注意的點(diǎn)就是需要使用字符串或者字符數(shù)組來(lái)存儲(chǔ)這兩個(gè)大數(shù)以及他們的結(jié)果,還有乘法計(jì)算過(guò)程中存在乘法進(jìn)位和加法進(jìn)位淋袖。

我先自己嘗試寫了一個(gè)答案鸿市,思路就是模擬手寫豎式乘法。

    static string MYMULTIPLY(const string &number1, const string &number2)
    {
        int length1 = number1.size();
        int length2 = number2.size();
        string result = "";

        if (length1 == 0 || length2 == 0)
        {
            result = "error";
            return result;
        }

        int *iresult;
        iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));
        memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));

        for(int i = length1 - 1, x = 0; i >= 0; i--, x++)
        {
            int numA = number1[i] - 48;
            int value1 = 0;
            int value2 = 0;
            int multiFlag = 0;//乘法進(jìn)位數(shù)
            int addFlag = 0;//加法進(jìn)位數(shù)

            for(int j = length2 - 1, y = 0; j >= 0; j--, y++)
            {
                int numB = number2[j] - 48;
                value1 = numA * numB + multiFlag;
                multiFlag = value1 / 10;
                value1 = value1 % 10;
                value2 = (iresult[x+y]) + value1 + addFlag;
                addFlag = value2 / 10;
                iresult[x+y] = (value2 % 10); 
            }
            iresult[x + length2] += (multiFlag + addFlag);
        }

        //逆序
        int i = 0;
        for(i = length1 + length2 - 1; i >= 0; i--)
        {
            if(iresult[i] != 0)
                break;
        }

        for(; i >= 0; i--)
        {
            result = result + (char)(iresult[i]+48);
        }

        free(iresult);

        return result;
    }

這個(gè)方法雖然能得出結(jié)果即碗,但是太難看了焰情,特別是計(jì)算每一位相乘的結(jié)果和進(jìn)位的那一段代碼。之后剥懒,我就把這段代碼改進(jìn)了一下内舟,將每一位之間的乘法和進(jìn)位計(jì)算分開(kāi)來(lái)。

    static string MULTIPLY(string number1, string number2)
    {
        int i, j;
        int *iresult;
        int length1 = number1.size();
        int length2 = number2.size();
        string result = "";

        reverse(number1.begin(), number1.end());
        reverse(number2.begin(), number2.end());

        if (length1 == 0 || length2 == 0)
        {
            result = "error";
            return result;
        }

        iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));
        memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));

        //每一位相乘
        for(i = 0; i < length1; i++)
        {
            for(j = 0; j < length2; j++)
            {
                iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));
            }
        }

        //進(jìn)位運(yùn)算
        int carry = 0;
        for(i = 0; i < length1 + length2; i++)
        {
            int value = iresult[i] + carry;
            iresult[i] = value % 10;
            carry = value / 10;
        }

        for(i = length1 + length2 - 1; i >= 0; i--)
        {
            if(iresult[i] != 0)
            break;
        }

        for(; i >= 0; i--)
        {
            result = result + (char)(iresult[i]+48);
        }

        free(iresult);

        if(result == "") result = "0";
        return result;
    }

當(dāng)然這個(gè)問(wèn)題還有分治乘法初橘,快速傅里葉等算法验游,這個(gè)就不是在筆試或者面試的時(shí)候能快速寫出來(lái)的了。有興趣大家可以繼續(xù)深入了解下保檐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耕蝉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夜只,更是在濱河造成了極大的恐慌垒在,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扔亥,死亡現(xiàn)場(chǎng)離奇詭異场躯,居然都是意外死亡谈为,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門推盛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)峦阁,“玉大人,你說(shuō)我怎么就攤上這事耘成±莆簦” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵瘪菌,是天一觀的道長(zhǎng)撒会。 經(jīng)常有香客問(wèn)我,道長(zhǎng)师妙,這世上最難降的妖魔是什么诵肛? 我笑而不...
    開(kāi)封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮默穴,結(jié)果婚禮上怔檩,老公的妹妹穿的比我還像新娘。我一直安慰自己蓄诽,他們只是感情好薛训,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仑氛,像睡著了一般乙埃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锯岖,一...
    開(kāi)封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天介袜,我揣著相機(jī)與錄音,去河邊找鬼出吹。 笑死遇伞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捶牢。 我是一名探鬼主播赃额,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叫确!你這毒婦竟也來(lái)了跳芳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竹勉,失蹤者是張志新(化名)和其女友劉穎飞盆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吓歇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年孽水,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片城看。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡女气,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出测柠,到底是詐尸還是另有隱情炼鞠,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布轰胁,位于F島的核電站谒主,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赃阀。R本人自食惡果不足惜霎肯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望榛斯。 院中可真熱鬧观游,春花似錦、人聲如沸驮俗。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)意述。三九已至,卻和暖如春吮蛹,著一層夾襖步出監(jiān)牢的瞬間荤崇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工潮针, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留术荤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓每篷,卻偏偏與公主長(zhǎng)得像瓣戚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子焦读,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • 一子库、計(jì)算機(jī)的發(fā)展史 01改變世界:沒(méi)有計(jì)算器的日子怎么過(guò)——手動(dòng)時(shí)期的計(jì)算工具 所謂計(jì)算機(jī),顧名思義矗晃,就是用于計(jì)...
    文思匯集閱讀 2,682評(píng)論 1 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法仑嗅,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法仓技,異常的語(yǔ)法鸵贬,線程的語(yǔ)...
    子非魚_t_閱讀 31,603評(píng)論 18 399
  • 貪心算法 貪心算法總是作出在當(dāng)前看來(lái)最好的選擇。也就是說(shuō)貪心算法并不從整體最優(yōu)考慮脖捻,它所作出的選擇只是在某種意義上...
    fredal閱讀 9,223評(píng)論 3 52
  • 2017年4月26日 天氣雨 星期三 經(jīng)典有好幾本阔逼,有易經(jīng)、有唐詩(shī)三百首地沮、有老子嗜浮、還有幼雪瓊林,我們還...
    琦琦花仙子小月閱讀 154評(píng)論 1 3
  • 如果時(shí)鐘的存在是為了提醒萎靡不振的人們不斷賽跑诉濒。那過(guò)往是否可以容納未來(lái)的光周伦。 如果生活的瞬息萬(wàn)變是在告知我們需要勇...
    蠶食閱讀 363評(píng)論 3 1