LintCode:M-大数相乘

58 篇文章 0 订阅
13 篇文章 0 订阅

LintCode链接


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

样例
  • 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.

public class Solution {
    /**
     * @param num1 a non-negative integers
     * @param num2 a non-negative integers
     * @return return product of num1 and num2
     */

    public String multiply(String num1, String num2) {
        
        //保证num1长度>num2
        if(num1.length()<num2.length()){
            return multiply(num2,num1);
        }
        int n2 = num2.length();
        char[] nums2 = (new StringBuffer(num2)).reverse().toString().toCharArray();
        String s1 = singleMul(num1, Integer.valueOf(nums2[0]+""),0);
        for(int i=1; i<n2; i++){
            String s2 = singleMul(num1, Integer.valueOf(nums2[i]+""),i);
            s1 = sum(s1,s2);
        }
        
        return s1;
    }
    String sum(String num1, String num2){
        StringBuffer bf = new StringBuffer("");
        char[] num1s = (new StringBuffer(num1)).reverse().toString().toCharArray();
        char[] num2s = (new StringBuffer(num2)).reverse().toString().toCharArray();
        int up=0;
        int i=0;
        while(i<num1.length() && i<num2.length()){
            int sum = Integer.valueOf(num1s[i]+"")+Integer.valueOf(num2s[i]+"")+up;
            up = sum/10;
            bf.append(sum%10+"");
            i++;
        }
        while(i<num1.length()){
            int sum = Integer.valueOf(num1s[i]+"")+up;
            up = sum/10;
            bf.append(sum%10+"");
            i++;
        }
        while(i<num2.length()){
            int sum = Integer.valueOf(num2s[i]+"")+up;
            up = sum/10;
            bf.append(sum%10+"");
            i++;
        }
        if(up>0)
            bf.append(up+"");
        
        return bf.reverse().toString();
    }
    
    //第k位上的数knum与num相乘的结果
    String singleMul(String num, int knum, int k){
        if(knum==0)
            return "0";
        StringBuffer bf = new StringBuffer("");
        char[] chars = new StringBuffer(num).reverse().toString().toCharArray();
        int up=0;
        for(int i=0; i<chars.length; i++){
            int mul = (Integer.valueOf(chars[i]+""))*knum+up;
            up = mul/10;
            bf.append(mul%10+"");
        }
        String res = (up>0?up+"":"")+bf.reverse().toString()+getZeros(k);
        return res;
    }
    
    String getZeros(int k){
        StringBuffer bf = new StringBuffer("");
        while(k>0){
            bf.append("0");
            k--;
        }
        return bf.toString();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值