• 力扣每日一题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本身。

    通过次数

    316.8K

    提交次数

    713.9K

    通过率

    44.4%

    思路和题解:

    不能使用任何内置的 BigInteger 库或直接将输入转换为整数,那就只能用数组来模拟数字乘法,也就是小学生的竖式乘法。我们来回忆一下小学生竖式乘法是怎么做的。

    先看第一种,每次两个位数乘完后加上上一次的进位,然后保留余数,记下进位。然后再把乘数a的整体和乘数b每位相乘的结果相加。相加时的进位方式和相乘时一样。直接看图你就懂了。

    再来看第二种,相乘和相加的时候都不考虑进位,等乘法和加法都做完后再考虑进位,看图你就懂了。

    代码:

    我用的是第二种方法,先乘法和加法都做完后再搞进位,这样可以不用边乘边加边进位,操作步骤简单些,好写。

    1. class Solution {
    2. public:
    3. string multiply(string num1, string num2) {
    4. if(num1=="0"||num2=="0")
    5. return "0";
    6. int m=num1.size(),n=num2.size();
    7. string ans;
    8. vector<int> ansArr(m+n);
    9. int i,j;
    10. //相乘
    11. for(i=m-1;i>=0;i--)
    12. {
    13. int x=num1[i]-'0';
    14. for(j=n-1;j>=0;j--)
    15. {
    16. int y=num2[j]-'0';
    17. ansArr[i+j+1]+=x*y;//照理来说是[i+j],但是[0]的位置要先留着存储最后一个进位,所以向前移一步
    18. }
    19. }
    20. //进位
    21. for(i=m+n-1;i>0;i--)
    22. {
    23. ansArr[i-1]+=ansArr[i]/10;
    24. ansArr[i]%=10;
    25. }
    26. //int数组转换为string
    27. i=ansArr[0]==0?1:0;
    28. while(i<m+n)
    29. {
    30. ans.push_back(ansArr[i]+'0');//不能用ans[i]=ansArr[i]+'0',这样没用。
    31. i++;
    32. }
    33. return ans;
    34. }
    35. };

  • 相关阅读:
    【Java异常易错点】try或catch语句块中return后,finally还会执行吗?
    企微自动群发软件:提升企业沟通效率的新利器
    java中的BigDecimal使用
    【Java八股文总结】之Spring
    “无法为保留分区分配驱动器号”的解决
    A1052 Linked List Sorting(25分)PAT 甲级(Advanced Level) Practice(C++)满分题解【链表地址+排序]
    (原创)【B4A】一步一步入门04:编译模式、打包为APK、私钥签名
    LVS集群
    MongoDB 学习笔记
    el-table 合集行合并
  • 原文地址:https://blog.csdn.net/m0_73441691/article/details/133870012