LeetCode (19) Multiply Strings

题目描述

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.

对两组非负数字进行相乘,使用数组表示数字,且题目中说明数组很大,因此,因此不能直接将数组转换成数字相乘。这道题目是要求自己构造乘法的思路,需要注意的地方主要为进位的处理。

解题思路

这道题目直接去计算不仅慢,而且很容易造成进位的错误,对于同一个数字上的值不仅来自相乘的结果,还有低位上进位的结果,且乘法不同于加法每次进位最多为1,只需要判断9的个数即可(类似字符串加1的题目可见:LeetCode (14) Plus One)。这里使用下面的思路就可以很优雅的解决问题了:

  • 将字符串数字转换为从低位到高位存储的字符数组,即输入字符串string s1,变为数组int n1[s1.size()](这里实际写代码的时候当然要用动态数组了,这里是为了表示方便)。
  • 对两个数组转成的数组按位相乘。即对数组n1和数组n2进行相乘,保存在数组n3中,需要注意的是n1[i]和n2[j]相乘的结果保存在n3[i+j]中。
  • 对数组n3中的数字进行处理,对需要进位的数字进行进位。例如,n3[i]中的数字保留n3[i]/10的值在n3[i]中,对n3[i]%10的部分加入n3[i+1]中。
  • 将n3的结果转为字符串数组string s3,并返回。需要注意的是n3的数组的低位在s3后面。
  • 去除字符串s3前部的0.

在去除s3前面的0的时候需要注意从s3[0]处理到s3[s3.size()-2],避免两个0相乘的结果得到s3为”00”,所有0均被删除掉。

代码如下:

class Solution {
public:
    void reverse(string& s)
    {
        int i = 0;
        int j = s.size() - 1;
        while (i < j)
        {
            swap(s[i++], s[j--]);
        }
    }
    string multiply(string num1, string num2) {
        reverse(num1);
        reverse(num2);
        int length = num1.size() + num2.size();
        int* m = new int[length]();
        for (size_t i = 0; i != num1.size(); ++i)
        {
            for (size_t j = 0; j != num2.size(); ++j)
            {
                m[i + j] += (num1[i] - '0') * (num2[j] - '0');
            }
        }
        string r;
        for (int i = 0; i != length; ++i)
        {
            int digit = m[i] % 10;
            int carry = m[i] / 10;
            if (i + 1 < length)
            {
                m[i + 1] += carry;
            }
            r.insert(0, 1, (digit + '0'));
        }

        int i = 0;
        while (r[i] == '0' && i < r.size()-1)
            ++i;
        r.erase(0, i);
        delete[] m;
        return r;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值