高精度乘法 Leetcode 043字符串相乘

地址

https://leetcode-cn.com/problems/multiply-strings/submissions/

描述

在这里插入图片描述

思想

在这里插入图片描述

代码

C++

class Solution {
public:
    string multiply(string num1, string num2) {
        vector<int> a,b;
        int n=num1.size(),m=num2.size();
        //倒着将字符串存入数组
        for(int i=n-1;i>=0;i--) a.push_back(num1[i]-'0');
        for(int i=m-1;i>=0;i--) b.push_back(num2[i]-'0');
        //以num1 = "123", num2 = "456"举例
        //num1[]={3,2,1},num2={6,5,4}
        //n位的num1与m位的num2相乘最大可得n+m位,可能达不到n+m位,前面为0
        vector<int> c(n+m);
        //不处理进位相乘
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                c[i+j]+=a[i]*b[j];
            }
        }
        //从0开始处理进位
        for(int i=0,t=0;i<c.size();i++){
            t+=c[i];//加上进位
            c[i]=t%10;//余数
            t/=10;//产生进位
        }
        int k=n+m-1;
        while(k>0){
            if(c[k]==0) k--;
            else break;
        }
        string res;
        for(int i=k;i>=0;i--){
            res+=c[i]+'0';
        }
        return res;

    }
};

Java

class Solution {
    public String multiply(String num1, String num2) {
        int n=num1.length();
        int m=num2.length();
        int []a=new int [n];
        int []b=new int [m];
        for(int i=0;i<n;i++) a[i]=num1.charAt(n-i-1)-'0';
        for(int i=0;i<m;i++) b[i]=num2.charAt(m-i-1)-'0';

        int []c=new int [n+m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                c[i+j]+=a[i]*b[j];
            }
        }
        int t=0;
        for(int i=0;i<n+m;i++){
            t+=c[i];
            c[i]=t%10;
            t/=10;
        }
        int k=n+m-1;
        while(k>0&&c[k]==0)k--;
        StringBuilder sb=new StringBuilder("");
        for(int i=k;i>=0;i--){
            sb.append(c[i]);
        }
        return sb.toString();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值