43. 字符串相乘

本文介绍了一种解决两个以字符串形式表示的大数相乘问题的算法,通过模仿手工乘法过程来避免使用BigInteger库。文章详细解释了如何逐位相乘并处理进位,附带提供了完整的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定两个以字符串形式表示的非负整数 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本身。


做题思路

  • 想想一下,我们在小学做两个大数相乘的时候的竖式

        1 2 3
    
    乘     4 5
    --------------
        6  1 5        式a
     4  9  2          式b
    --------------
     5  5  3 5
    
  • 本题我就是按照小学的思路来求解的

    1. 先求出乘数的每一位与被乘数相乘得到一个数
    2. 最后将所有的 ‘中间结果’ 相加 就可以得到最终的结果了
  • 但是需要注意一些细节:

    • 比如说在最后算完之后,进位是否大于0?

      如果大于0的话还需要继续算进去

    • 刚开始的时候我们就需要判断字符串中是否存在0值

      存在的话直接返回就可以,就不必接下来的运算

    • 注意我上面写的运算式子,注意看式b

      式b的最右边,我虽然没有写任何东西,但是实际上 最右边默认有一个 0值的

      也就是:4920

      我们知道:乘数从右到左每提出一位将要进行计算的元素的时候,都需要默认的往前进一位,后米娜的位数都需要默认的用0来补充

代码实现

class Solution {
  public String multiply(String num1, String num2) {
    if(num1.equals("0")|| "0".equals(num2)){
      return "0";
    }
    int n1=num1.length();
    int n2=num2.length();
    String res="0";
    for(int i=n2-1;i>=0;i--){
      StringBuilder sb=new StringBuilder();
      for(int j=n2-1;j>i;j--){
        sb.append(0);
      }
      int up=0;
      for(int k=n1-1;k>=0;k--){
        int ns2=num2.charAt(i)-'0';
        int ns1=num1.charAt(k)-'0';
        sb.append((ns1*ns2 + up)%10  + "" );
        up=(ns2*ns1 + up)/10;
      }
      if(up!=0){
        sb.append(""+up);
      }
      res=addString(res,sb.reverse().toString());
      // 921 * 3
    }
    return res;
  } 
  public String addString(String a,String b){
    int up=0;
    int i=a.length()-1;
    int j=b.length()-1;
    StringBuilder sb=new StringBuilder();
    int nu1=0;
    int nu2=0;
    while( i>=0 || j>=0 || up!=0 ){
      
      if(i<0){
        nu1=0;
      }else{
        nu1=a.charAt(i)-'0';
      }
      if(j<0){
        nu2=0;
      }else{
        nu2=b.charAt(j)-'0';
      }
      sb.append((nu1+nu2+up)%10 +"");
      up=(nu1+nu2+up)/10; 

      i--;
      j--;

    }
    return sb.reverse().toString();
  }
}

题目链接

43. 字符串相乘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C_x_330

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

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

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

打赏作者

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

抵扣说明:

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

余额充值