LeetCode OJ算法题(四十二):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.

解法:

本题要求实现大数乘法,可以利用手算乘法的思想,每一位相乘后坐加法,因此我们可以先实现大数加法

大数加法从字符串末尾开始遍历,求出每一对应位相加(还有进位)的和,算出下一位的进位,最后得到sum

一个个位数与大数相乘也可以采用这一思路,最后将所有乘积相加,得到结果

值得注意的是结果会出现000这种情况,这是因为150*0这种计算,会产生100*0 = 000的情况,故在返回结果时从第一个不为0的字符开始

public class No42_MultiplyString {
	public static void main(String[] args){
		System.out.println(multiply("0", "150"));
	}
	public static String multiply(String num1, String num2) {
		String ret = "";
        for(int i=num1.length()-1;i>=0;i--){
        	String ts = "";
        	int c = 0;
        	for(int j=num2.length()-1;j>=0;j--){
        		int m = (num1.charAt(i)-'0')*(num2.charAt(j)-'0') + c;
        		c = m / 10;
        		m = m % 10;
        		ts = ""+m+ts;
        	}
        	if(c>0)
        		ts = ""+c+ts;
        	if(!ts.equals("0")){
        		int k = 0;
            	while(k<num1.length()-1-i){
            		k++;
            		ts += "0";
            	}
        	}
        	ret = sum(ret, ts);
        }
        //return ret;
        int p = 0;
        while(p<ret.length()-1 && ret.charAt(p) == '0') p++;
        return p<=ret.length()-1?ret.substring(p):"0";
    }
	public static String sum(String num1, String num2){
		if(num1.length()==0 && num2.length() == 0)
			return "0";
		if(num1.length()==0)
			return num2;
		if(num2.length()==0)
			return num1;
		String ret = "";
		int c = 0;
		int i=num1.length()-1,j=num2.length()-1;
		while(i>=0 || j>=0){
			int s = (i>=0?(num1.charAt(i)-'0'):0) + (j>=0?(num2.charAt(j)-'0'):0) + c;
			c = s / 10;
			s = s % 10;
			ret = ""+s+ret;
			i--;
			j--;
		}
		return c>0?(""+1+ret):ret;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值