43、字符串乘法

  1. 43、字符串乘法
    1. 示例 1:
    2. 示例 2:
  2. 思路
  3. 代码
  4. 转换成整数数组求解

43、字符串乘法

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

示例 1:

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

示例 2:

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

  • 说明:

num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。

链接:https://leetcode-cn.com/problems/multiply-strings

思路

  • 模拟乘法的每一步
  • 推导中间结果与最终结果的关系
    • 第i位与第j位相乘,结果的第i+j加上结果的个位数,第i+j+1位存放进位
    • 重复此步骤计算即可
  • 低位在后面
    • t = a[i]*b[j] + result[i+j+1] 迭代求i+j+1位的数字
    • result[i+j+1] = t%10+'0' 更新第i+j+1位的结果
    • result[i+j] += t/10; 更新进位

ss

代码

class Solution {
public:
    string multiply(string num1, string num2) {
        int n1=num1.size();
        int n2=num2.size();
        string res(n1+n2,'0');
        for(int i=n2-1;i>=0;i--){// 最小位在最后
            for(int j=n1-1;j>=0;j--){// 最小位在最后
                int temp=(res[i+j+1]-'0')+(num1[j]-'0')*(num2[i]-'0');// 迭代更新
                res[i+j+1]=temp%10+'0';//当前位
                res[i+j]+=temp/10; //前一位加上进位,res[i+j]已经初始化为'0',加上int类型自动转化为char,所以此处不加'0'
            }
        }
        
//去除首位'0'
        for(int i=0;i<n1+n2;i++){
            if(res[i]!='0')
                return res.substr(i);
        }
        return "0";
       
        
    }
};


// 作者:carryzz
// 链接:https://leetcode-cn.com/problems/multiply-strings/solution/c-shu-shi-cheng-fa-dai-ma-jian-ji-you-ya-yi-dong-b/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • Java版
class Solution {
    public String multiply(String num1, String num2) {
        // 模拟计算,用大整数加法完成计算
        // 乘积为0的情况
        if (num1.charAt(0) == '0' || num2.charAt(0) == '0') {
            return "0";
        }
        int len1 = num1.length();
        int len2 = num2.length();
        char[] res = new char[len1+len2];
        for (int i = 0;i < len1+len2;i++) {
            res[i] = '0';
        }
        char[] a = num1.toCharArray();
        char[] b = num2.toCharArray();
        for (int i = len2 - 1;i >= 0;i--) {
            for (int j = len1 - 1;j >= 0;j--) {
                int t = (res[i+j+1] - '0') + (a[j] - '0')*(b[i] - '0');
                res[i+j+1] = (char)(t%10 + '0');
                res[i+j] += t/10;
            }
        }
        
        StringBuilder ans = new StringBuilder("");
        boolean first = true;
        for (int i = 0;i < len1 + len2;i++) {
            if (first){
                if (res[i] != '0') {
                    first = false;
                    ans.append(res[i]);
                }
            }else {
                ans.append(res[i]);
            }
        }
        return ans.toString();
    }
}

转换成整数数组求解

class Solution {
    public static String multiply(String num1,String num2) {
        StringBuilder sBuilder=new StringBuilder();
        int []arr1=toInt(num1);
        int []arr2=toInt(num2);
        if((arr1.length==1&&arr1[0]==0)||(arr2.length==1&&arr2[0]==0)) {
            return "0";
        }
        int []result=new int[arr1.length+arr2.length];
        for(int i=0;i<arr1.length;i++) {
            for(int j=0;j<arr2.length;j++) {
                result[i+j+1]+=(arr1[i]*arr2[j]);
            }
        }
        for(int k=result.length-1;k>0;k--) {
            if(result[k]>=10) {
                result[k-1]+=(result[k]/10);
                result[k]=result[k]%10;
            }
        }
        
        if(result[0]==0) {
            for(int i=1;i<result.length;i++) {
                sBuilder.append(result[i]);
            }
        }else {
            for(int i=0;i<result.length;i++) {
                sBuilder.append(result[i]);
            }
        }
        
        return sBuilder.toString();
//		System.arraycopy(result, 1, x, 0, result.length-1);
//		return Arrays.toString(result);
        
    }
    public static int[] toInt(String str) {
        int []arr=new int[str.length()];
        for(int i=0;i<arr.length;i++) {
            arr[i]=(str.charAt(i)-'0');
        }
        return arr;
    }
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

💰

Title:43、字符串乘法

Count:889

Author:攀登

Created At:2020-07-26, 00:19:44

Updated At:2024-06-15, 15:52:32

Url:http://jiafeimao-gjf.github.io/2020/07/26/43%E3%80%81%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B9%98%E6%B3%95/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation