【一天一道算法题】 两个字符串相乘

最近在面试某大厂,跪在了最后一面技术面上。面试官要求带电脑,并在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;
}

 其实题目本身并不难,说面试时紧张也好,同时平时编码少,说缺乏熟练度也好,总之跪在了最后一面。

非常遗憾,今后仍需要加强编码。

原文地址:https://www.cnblogs.com/corineru/p/11173245.html