【Leetcode】43. 字符串相乘

在这里插入图片描述

Halo,这里是Ppeua。平时主要更新C++,数据结构算法,Linux与ROS…感兴趣就关注我bua!


img

题目:

在这里插入图片描述

示例:

在这里插入图片描述

题解:

这是一个大数相乘的问题,类似于这篇文章中的高精度乘法 但是高精度乘法只是其中的一个数超过了整形的最大值。这里可以是两个数。所以我们需要进行一下数据的处理。

  1. 先将num1与num2进行一个string to int的处理:让其每一位都减去‘0’得到int中对应的数字

  2. 因为我们要做的是模拟笔算中的乘法,从个位开始算,所以要将其倒着存储:从后往前依次push到vector中

  3. 创建答案数组,将其num1(vector)与num2(vector)每一位相乘,放入对应下标和中,为什么要放入下标和中呢?

    观察下面的式子就能明白啦。

在这里插入图片描述

  1. 因为我们计算的时候是将这个结果直接存入对应的位数中,现在需要计算最后的结果,需要提取他们的个位数

  2. 因为最开始分配的空间是以num1.size()+num2.size()分配的,可能会出现计算的结果仅是五位数,而答案数组的空间是6位数的结果.需要去除数组尾端的0

  3. 最后将结果反转依次存入string中即可

详细图解:

在这里插入图片描述

代码实现:

class Solution {
public:
    string multiply(string num1, string num2) {
        vector<int>v1,v2;
        for(int i=num1.size()-1;i>=0;i--)v1.push_back(num1[i]-'0');
        for(int i=num2.size()-1;i>=0;i--)v2.push_back(num2[i]-'0');
        vector<int>ans(num1.size()+num2.size());
        for(int i=0;i<num1.size();i++)
        {
            for(int j=0;j<num2.size();j++)
            {
                ans[i+j]+=v1[i]*v2[j];
            }
        }
        int t=0;
        for(int i=0;i<ans.size();i++){
            t+=ans[i];
            ans[i]=t%10;
            t/=10;
        }
        int k=ans.size()-1;
        while(k>0&&ans[k]==0)k--;
        string res;
        while(k>=0)res+=ans[k--]+'0';
        return res;
    }
};

class Solution {

public:

string multiply(string num1, string num2) {

​ vectorv1,v2;

​ for(int i=num1.size()-1;i>=0;i–)v1.push_back(num1[i]-‘0’);

​ for(int i=num2.size()-1;i>=0;i–)v2.push_back(num2[i]-‘0’);

​ vectorans(num1.size()+num2.size());

​ for(int i=0;i<num1.size();i++)

​ {

​ for(int j=0;j<num2.size();j++)

​ {

​ ans[i+j]+=v1[i]*v2[j];

​ }

​ }

​ int t=0;

​ for(int i=0;i<ans.size();i++){

​ t+=ans[i];

​ ans[i]=t%10;

​ t/=10;

​ }

​ int k=ans.size()-1;

​ while(k>0&&ans[k]==0)k–;

​ string res;

​ while(k>=0)res+=ans[k–]+‘0’;

​ return res;

}
(k>0&&ans[k]==0)k–;

​ string res;

​ while(k>=0)res+=ans[k–]+‘0’;

​ return res;

}

};

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ppeua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值