【一天一道算法題】 兩個字符串相乘


最近在面試某大廠,跪在了最后一面技術面上。面試官要求帶電腦,並在40分鍾內當場完成一道題並要求跑通。

題目是兩個數字字符串相乘,得出的結果也用字符串輸出。例如給string a = "123", string b = "456",求出結果字符串。

 

回來仔細思考了一下,並在1小時內完成了這道題。

思路如下:

要計算123 * 456,可以模擬我們自己在進行乘法運算的過程,先計算6 * 123 = 738, 再計算5*123 = 615, 再計算4*123 = 492。

最后再對三個字符串做移位相加。移位就是在后面補零。如果字符串還不相等,就在前面補0,知道兩個字符串長度相等,再進行相加操作。

 

代碼如下:

#include<iostream>
#include<string>

using namespace std;


//單個字符與字符串相乘的結果
string multiply(string a, char b)
{
    int len = a.size();
    int i0 = 0, i1 = 0;
    int current;
    int temp = 0;
    string res;
    for(int i=len-1;i>=0;i--)
    {
        current = (a[i] - '0')*(b-'0') + temp;
        i0 = current%10; //個位
        i1 = current/10; //十位
        res = char(i0 + '0') + res;
        temp = i1;
    }
    if(i1!=0)
        res = char(i1 + '0') + res;
    return res;
}

//兩個字符串錯位相加
string add(string a, string b, int b_shift)
{
    string res;
    
    if(a.size() == 0)
        return b;
    for(int i=0;i<b_shift;i++)
        b = b + '0';
    
   
    int len_a = a.size();
    int len_b = b.size();
    int diff = len_a - len_b;
    if(diff>0)
    {
        for(int i=0;i<diff;i++)
            b = '0' + b;
    }
    else if(diff<0)
    {
        for(int i=0;i<abs(diff);i++)
        {
            a = '0' + a;
        }
    }
    
    int len = a.size();
    int current;
    int temp = 0;
    int i0 = 0, i1 = 1;
    for(int i=len-1;i>=0;i--)
    {
        current = a[i] - '0' + b[i] - '0' + temp;
        i0 = current%10;
        i1 = current/10;
        
        res = char(i0 + '0') + res;
        temp = i1;
    }
    if(i1>0)
        res = char(i1 + '0') + res;
    return res;
}

//兩個字符串相乘
string multiply(string a, string b)
{
    int len_a = a.size();
    int len_b = b.size();
    
    string current;
    string res;
    for(int i=b.size()-1;i>=0;i--)
    {
        current = multiply(a, b[i]);
        res = add(res, current, b.size() - i -1);
    }
    return res;
}
int main()
{
    string a = "98376";
    string b = "51209";
    string res = multiply(a, b);
    cout<<res<<endl;
}

 其實題目本身並不難,說面試時緊張也好,同時平時編碼少,說缺乏熟練度也好,總之跪在了最后一面。

非常遺憾,今后仍需要加強編碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM