[LeetCode][Java] Multiply Strings

题目:

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.

题意:

给定两个数字分别用字符串表示出来,返回这两个数字的乘积,同样用字符串表示。

注意:数字会非常大而且是非负的。

算法分析:

方法一:

直接乘会溢出,这里可以利用java中的 BigInteger

方法二:

参考http://pisxw.com/algorithm/Multiply-Strings.html

该题需要知道,mn位数的乘积,最终结果为m+n-1位或是m+n位(进位时)。乘法计算中可以发现,结果中第i位,应该由第一个字符串中的第1位乘以第二个字符串中的第i位,第一个字符串中的第2位乘以第二个字符串中的第i-1位,.......第一个字符串中的第i位乘以第二个字符串中的第1位,最后累加求得,最后我们取个位上的数值,然后剩下的作为进位放到下一轮循环中

AC代码:

方法一:

import java.math.BigInteger;  //Java
public class Solution 
{
   public String multiply(String num1, String num2) 
   {
		BigInteger temp1 = new BigInteger(num1);
		BigInteger temp2 = new BigInteger(num2);
		BigInteger result = temp1.multiply(temp2);
		return result.toString();
    }
}

方法二:

public class Solution 
{
    public String multiply(String num1, String num2)
    {
        if(num1==null || num2==null)
            return "";
        if(num1.charAt(0)=='0')
            return "0";
        if(num2.charAt(0)=='0')
            return "0";
        int num1length=num1.length();
        int num2length=num2.length();
        //分别对两个开始字符串进行转置,便于后面的下标遍历
        num1=new StringBuilder(num1).reverse().toString();
        num2=new StringBuilder(num2).reverse().toString();
        StringBuilder res=new StringBuilder();
        int jinwei=0;
        //从低位开始计算,最后乘积的位数为m+n-1,如果进位则是m+n
        for(int i=0;i<num1length+num2length-1;i++)
        {
            int multi=jinwei;
            for(int j=0;j<=i;j++)
            {            
                if(j<num1length && (i-j)<num2length)
                {
                    multi+=(num1.charAt(j)-'0')*(num2.charAt(i-j)-'0');
                }
            }
            res.append(multi%10);
            jinwei=multi/10;
        }
        //考虑最后一位是否有进位
        if(jinwei!=0)
            res.append(jinwei);
        return res.reverse().toString();     
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值