【筆試題】拼多多2018校招內推編程

2、大數據相乘

問題描述

有兩個用字符串表示的非常大的大整數,算出他們的乘積,也是用字符串表示。不能用系統自帶的大整數類型。

輸入描述:
空格分隔的兩個字符串,代表輸入的兩個大整數

輸出描述:
輸入的乘積,用字符串表

問題分析

感覺有點坑,在編譯器上可以通過,牛客上通不過,還有這道題沒有考慮很多問題,比如說符號問題,輸入非法情況,

所以,以後編程題,先做出來,再考慮其他問題。

大數據相乘,就是字符串相乘,有兩種普通的方法,移位進位法和逐位相乘法。

代碼實現

(1)移位進位法

移位進位法,大體上就是普通人正常計算乘法的思維。

這裏寫圖片描述

//移位進位法
string Mul(string left, string right)
{

    size_t Lsize = left.size();
    size_t Rsize = right.size();
    size_t Size = Lsize + Rsize;
    string res(Size, '0');

    int takevoer = 0;//進位
    int offset = 0;//移位

    size_t idx = 1, j = 1;
    for ( idx = 1; idx <= Rsize; ++idx)
    {   
        takevoer = 0;
        int rightnum = right[Rsize - idx] - '0';
        //計算每一位與left相乘
        for ( j = 1; j <= Lsize; ++j)
        {       
            char resBit = res[Size - j - offset] - '0';
            int num = rightnum * (left[Lsize - j] - '0') + takevoer + resBit;
            takevoer = num / 10;
            res[Size - j - offset] = num % 10 + '0';    
        }
        if (takevoer != 0)
            res[Size - j - offset] = takevoer + '0';
        offset++;
    }

    //如果沒有進位的話,res最高位沒有數字
    if (res[0] == '0')
        res.erase(0,1);
    return res;

}

2、逐位相乘法

這個方法是,把計算的結果不考慮進位都保存到一個數組中,
然後在考慮進位。

//逐位相乘法
//將計算的整體結果保存res中,然後再考慮進位
string Mul2(string left,string right)
{
    size_t lSize = left.size();
    size_t Rsize = right.size();
    size_t Size = lSize + Rsize;
    vector<int> res(Size, 0);
    /*int *res = new int[Size];
    memset(res, 0, sizeof(int)* Size);*/


    for (size_t i = 0; i < Rsize; ++i)
    {
        int rightnum = right[Rsize - i - 1] - '0';
        for (size_t j = 0; j < lSize; ++j)
        {
            int num = rightnum * (left[lSize - j - 1] - '0');
            //逆序存放
            res[Size - 1 -(i + j)] += num;
        }
    }
    //處理進位
    int takeover = 0;
    size_t idx = 0;
    for (; idx < Size; ++idx)
    {
        int temp = res[Size - idx - 1] + takeover;
        res[Size - idx - 1] = temp % 10;
        takeover = temp / 10;
    }
    //進位沒有處理完
    while (takeover != 0)
    {
        res[Size - idx - 1] = takeover % 10 ;
        takeover /= 10;
    }

    //處理返回結果
    string result;
    for (size_t index = 0; index < Size; ++index)
    {
        result += res[index] + '0';
    }
    //如果沒有進位的話,res最高位沒有數字
    if (result[0] == 0)
        result.erase(0, 1);

    return result;
}
int main()
{
    string data;
    getline(cin, data);
    size_t pos = data.find(' ');
    string left = data.substr(0, pos);
    string right = data.substr(pos + 1);
    string res = Mul2(left, right);
    cout << res << endl;
    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章