LeetCode 43. 字符串相乘 大数乘法模拟,中等

题目

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”

示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”

提示:
1 <= num1.length, num2.length <= 200
num1 和 num2 只能由数字组成。
num1 和 num2 都不包含任何前导零,除了数字0本身。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

难得自己写的时间快,内存消耗少,特意截图mark一下

思路

本题模拟乘法过程,通过两个数组来实现,具体过程不是很难,关键点在处理里面的字符串上,对于ans的处理有分类,是否有初始值很关键。还有就是增加一个add值,作为对上面的记忆化处理。

前置知识点

  • 对于string str="00000001";的处理,这里可以作为一个板子,用于处理"0000001123"的情况
    对于c++中这个的处理,搜了蛮多博客,但是讲的是驴唇不对马嘴,有一个离谱的博客,标题写的是c++中format的应用,但是里面的内容是java中format的应用。format貌似是一种处理字符串中的方法,不过我也没找到能快速上手的办法。。。从实用主义出发,后面有机会学到再说吧。
void dezero(string &x)
    {
        int i=0;
        for(i=0;i<x.length()-1;i++)
        if(x[i]!='0')
        break;
        x.erase(0,i);
        return ;
    }
  • string str=“0123”;str.erase(0,2);//str消除了0到2的位置的值,此时str=“3”
  • reverse(str.begin(),str.end());//str由0123翻转成3210

代码

#include<string>
#include<cstring>
class Solution {
public:
    void dezero(string &x)
    {
        int i=0;
        for(i=0;i<x.length()-1;i++)
        if(x[i]!='0')
        break;
        x.erase(0,i);
        return ;
    }
    string multiply(string num1, string num2) {
        string ans="";
        int len1=num1.length(),len2=num2.length();
        int add=0;
        
        for(int i=len1-1;i>=0;i--)
        {
            for(int j=len2-1;j>=0;j--)
            {
                int k=len1-1-i+len2-1-j;//此处k用于定位ans
                int now1=num1[i]-'0',now2=num2[j]-'0';
                int now;
                /*如果ans已经有值了,比如123*456,处理的时候是
                先算3*456=1368,ans此时等于8631,然后计算2*456
                对2*6来说,此时now=2*6+0+6,add=1,ans[1]=8,
                
                */if(ans.length()>=k+1)
                {
                    now=now1*now2+add+ans[k]-'0';
                    add=now/10;
                    ans[k]=(now%10+'0');
                }
                else
                {
                    now=now1*now2+add;
                    add=now/10;
                    ans.push_back(now%10+'0');
                }
            }
            /*此处处理add进位,比如3*456,上面的for循环
            实现ans存入863(3*456=1368),然后还剩add进位在下面处理
            */
            if(add!=0)
            ans.push_back(add+'0');
            add=0;
        }
        reverse(ans.begin(),ans.end());
        dezero(ans);
        // for(int i=0;i<ans.length();i++)
        // {
        //     if(ans[i]!='0')
        //     {
        //         ans.format("%s",&ans[i]);
        //         break;
        //     }
        // }
        return ans;
    }
};

总结

之后还需要学习大数加减除等算法,路漫漫其修远兮,吾将上下而求索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值