大整数乘法--leetcode Multiply Strings

大整数乘法

本文转载自http://www.cnblogs.com/TenosDoIt/p/3735309.html
我们在日常的大整数计算中,通常是把它转化为字符型计算。这道题的思路就和我们小学计算乘法一样,
想乘的的结果,错位相加,最终进位,得到我们 的结果。


题干如下:

Given two non-negative integers num1 and num2 represented as strings, 
return the product of num1 and num2.

Note:

   The length of both num1 and num2 is < 110.
    Both num1 and num2 contains only digits 0-9.
    Both num1 and num2 does not contain any leading zero.
    You must not use any built-in BigInteger library or 
    convert the inputs to integer directly.

思路很简单,实现有点绕:
这里引用了JustDoIT博客的内容,分析如下:

289*785为例:

这里写图片描述

首先我们把每一位相乘,得到一个没有进位的临时结果,如图中中间的一行红色数字就是临时结果,然后把临时结果从低位起依次进位。对于一个m位整数乘以n位整数的结果,最多只有m+n位。
注意:结果中需要去掉前导0,还需要注意结果为0的情况


代码如下:

class Solution {
public:
    string multiply(string num1, string num2) {
        int s1 = num1.size();
        int s2 = num2.size();
        if(num1 == "0" || num2 == "0")return "0";
        int k = s1+s2-2;
        if(k <= 0){}
        vector<int>v(s1+s2,0);
        for(int i = 0; i<s1;i++) //未进位
            for(int j = 0;j<s2;j++){
                v[k-i-j]+=(num1[i]-'0')*(num2[j]-'0');
            }
        int carry = 0;
        for(int i = 0;i<s1+s2;i++){ //进位
            v[i]+=carry;
            carry = v[i]/10;
            v[i] = v[i]%10;
        }
        reverse(v.begin(),v.end());
        int u = 0;
        while(v[u] == 0)u++; //去掉前面的0
        string res = "";
        for(int i = u;i<v.size();i++)
            res+=v[i]+'0';
        return res;
    }
};

下面更新一个Java版本的:

class Solution {
    public String multiply(String num1, String num2) {
        int len1 = num1.length();
        int len2 = num2.length();
        int[] res = new int[len1+len2];
        int bit = 0;
        for(int i = len1-1; i>=0; i--){
            for(int j = len2-1; j>=0; j--){
                int ret = (num1.charAt(i)-'0') * (num2.charAt(j)-'0') + res[i+j+1];
                res[i+j] += ret / 10;
                res[i+j+1] = ret % 10;
            }
        }
        boolean flag = true;   // 去除前导0
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i<res.length; i++){
            if(res[i] == 0 && flag){
                continue;
            }else{
                flag = false;
                sb.append(res[i]);
            }
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值