Multiply Strings

本文介绍了一种处理任意大小整数相乘的方法,并通过字符串形式实现这些整数的乘法运算。文中提供了详细的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.

public class Solution {
  public static String multiply(String num1, String num2) {
      if(num1.equals("0") || num2.equals("0"))
			return "0";
		if (hasSign(num1))
			num1 = num1.substring(1);
		if (hasSign(num2))
			num2 = num2.substring(1);
		StringBuilder sb = new StringBuilder();
		int len_1 = num1.length();
		int len_2 = num2.length();
		int flag_mul =0;
		int tmp_1=0;
		if (len_1 <= len_2) {
			if (len_1 == 1) {
				int tmp = Integer.parseInt(num1);
				for (int i = 0; i < len_2; i++) {
					tmp_1 = Integer.parseInt(num2.substring(len_2-1-i,len_2-i));
					tmp_1 = tmp* tmp_1;
					tmp_1 +=flag_mul;
					flag_mul = tmp_1 /10;
					tmp_1 = tmp_1%10;
					sb.append(tmp_1);
				}
				if(flag_mul != 0 )
					sb.append(flag_mul);
				sb.reverse();
			}else{
				sb.append(0);
				for(int i=0;i<len_1;i++){
					String str_tmp = sb.toString();
					sb.setLength(0);
					sb.append(multiply(num1.substring(len_1-1-i,len_1-i), num2));
					for(int j=i;j>0;j--){
						sb.append(0);
					}
					String str_tmp_2 = StrAdd(str_tmp, sb.toString());
					sb.setLength(0);
					sb.append(str_tmp_2);
				}
			}
		} else {
			if (len_2 == 1) {
				int tmp = Integer.parseInt(num2);
				for (int i = 0; i < len_1; i++) {
					tmp_1 = Integer.parseInt(num1.substring(len_1-1-i,len_1-i));
					tmp_1 = tmp* tmp_1;
					tmp_1 +=flag_mul;
					flag_mul = tmp_1 /10;
					tmp_1 = tmp_1%10;
					sb.append(tmp_1);
				}
				if(flag_mul != 0 )
					sb.append(flag_mul);
				sb.reverse();
			}else{
				sb.append(0);
				for(int i=0;i<len_2;i++){
					String str_tmp = sb.toString();
					sb.setLength(0);
					sb.append(multiply(num2.substring(len_2-1-i,len_2-i), num1));
					for(int j=i;j>0;j--){
						sb.append(0);
					}
					String str_tmp_2 = StrAdd(str_tmp, sb.toString());
					sb.setLength(0);
					sb.append(str_tmp_2);
				}
			}
		}
		return sb.toString();
	}

	public static String StrAdd(String num1, String num2) {
		StringBuilder sb = new StringBuilder();
		if (hasSign(num1))
			num1 = num1.substring(1);
		if (hasSign(num2))
			num2 = num2.substring(1);
		sb.setLength(0);
		int len_1 = num1.length();
		int len_2 = num2.length();
		boolean flag_add = false;
		int tmp = 0;
		if (len_1 <= len_2) {
			for (int i = 0; i < len_1; i++) {
				tmp = Integer
						.parseInt(num1.substring(len_1 - 1 - i, len_1 - i))
						+ Integer.parseInt(num2.substring(len_2 - 1 - i, len_2
								- i));
				if (flag_add == true) {
					tmp++;
					flag_add = false;
				}
				if (tmp >= 10) {
					tmp -= 10;
					flag_add = true;
				}
				sb.append(tmp);
			}
			for (int i = len_1; i < len_2; i++) {
				tmp = Integer
						.parseInt(num2.substring(len_2 - 1 - i, len_2 - i));
				if (flag_add == true) {
					tmp++;
					flag_add = false;
				}
				if (tmp >= 10) {
					tmp -= 10;
					flag_add = true;
				}
				sb.append(tmp);
			}
			if (flag_add == true) {
				flag_add = false;
				sb.append(1);
			}
		} else {
			for (int i = 0; i < len_2; i++) {
				tmp = Integer
						.parseInt(num1.substring(len_1 - 1 - i, len_1 - i))
						+ Integer.parseInt(num2.substring(len_2 - 1 - i, len_2
								- i));
				if (flag_add == true) {
					tmp++;
					flag_add = false;
				}
				if (tmp >= 10) {
					tmp -= 10;
					flag_add = true;
				}
				sb.append(tmp);
			}
			for (int i = len_2; i < len_1; i++) {
				tmp = Integer
						.parseInt(num1.substring(len_1 - 1 - i, len_1 - i));
				if (flag_add == true) {
					tmp++;
					flag_add = false;
				}
				if (tmp >= 10) {
					tmp -= 10;
					flag_add = true;
				}
				sb.append(tmp);
			}
			if (flag_add == true) {
				flag_add = false;
				sb.append(1);
			}
		}
		return sb.reverse().toString();
	}

	public static boolean hasSign(String num) {
		if (num.charAt(0) == '-' || num.charAt(0) == '+')
			return true;
		else
			return false;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值