• LeetCode 43. 字符串相乘(Multiply Strings) 大数乘法


    题目描述

    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

    示例 1:

    输入: num1 = "2", num2 = "3"
    输出: "6"

    示例 2:

    输入: num1 = "123", num2 = "456"
    输出: "56088"

    说明:

    1. num1 和 num2 的长度小于110。
    2. num1 和 num2 只包含数字 0-9
    3. num1 和 num2 均不以零开头,除非是数字 0 本身。
    4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理

    解题思路

    根据数字乘法的计算规则,从一个数个位开始依次求出与另一个数的乘积并逐位相加。下面以“98”和“99”的乘法计算来说明算法思想。

    1. 首先考虑乘积的总位数,两个数相乘的最大位数为两数的位数之和,所以先申请一个结果字符串位数为4,并且每一位都初始化为‘0’
    2. 从第一个数的个位数‘8’开始,依次与“99”相乘。在乘法过程中首先初始化每一位置的进位add为0,然后计算出对应单个位的乘积mul,比如第一位8x9=72,然后取其个位与当前位置的数字以及前一位置的进位add相加得到sum,此时sum为2+0+0=2,所以结果字符串的个位数字就为‘2’。当前位置的进位add更新为mul的十位数与sum十位数之和,此时进位add为7+0=7.
    3. 计算完一次单个位置的乘法后,最后将当前乘积的前一位更新为add,具体来说8x99=792,但遍历完99后结果只记录了最后两位“92”,此时进位add为7,所以要将前一位更新为7

    计算完结果后要判断输出的总位数,因为可能出现结果字符串前几位都是0的情况,找到第一位不是0的数字然后返回之后的字符串。

    代码

     1 class Solution {
     2 public:
     3     string multiply(string num1, string num2) {
     4         int l1=num1.size(),l2=num2.size();
     5         string res(l1+l2,'0');
     6         if(l1==0||l2==0)
     7             return "";
     8         for(int i=l1-1;i>=0;i--){
     9             int add=0;
    10             for(int j=l2-1;j>=0;j--){
    11                 int mul=(num1[i]-'0')*(num2[j]-'0');
    12                 int sum=res[i+j+1]+add+mul%10-'0';
    13                 res[i+j+1]='0'+sum%10;
    14                 add=mul/10+sum/10;
    15             }
    16             res[i]+=add;
    17         }
    18         for(int i=0;i<l1+l2;i++)
    19             if(res[i]!='0')
    20                 return res.substr(i);
    21         return "0";
    22     }
    23 };
  • 相关阅读:
    TCP连接之报文首部
    Django基础篇--用户权限管理和组管理
    MySQL聚簇索引
    浅谈Redis之慢查询日志
    Django基础篇--模板和路由分发
    Django--数据库查询操作
    Django基础篇--Models
    Sqlautocode使用过程的一些坑
    关于域名的一点事
    unicode编码和utf8编码的区别
  • 原文地址:https://www.cnblogs.com/wmx24/p/9064134.html
Copyright © 2020-2023  润新知