首页 > 技术文章 > 字符串乘法

YangLin2510 2018-11-28 16:44 原文

字符串乘法

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积, 它们的乘积也表示为字符串形式。

说明:

  • num1 和num2 的长度小于110。 num1 和 num2 只包含数字 0-9。
  • num1 和 num2 均不以零开头,除非是数字 0 本身。
  • 不能使用任何标准库的大数类型(比如BigInteger)或直接将输入转换为整数来处理。

对于数num1从个位开始依次与num2相乘然后求和。算法和手工计算乘法一样没什么特别的地方。
以12 * 23 为例,计算过程如下:
2 * 23 = 46
(1 * 23)*10 = 230 //考虑进位,加法也一样
46 + 230 = 276

public String multiply(String num1, String num2) {
		//任意一个数为零
		if("0".equals(num1) || num2.equals("0")){
			return "0";
		}
		String sum = "";
		for (int i = num1.length() - 1; i >= 0; i--) {
			String[] tmpSum = new String[num2.length() + 1];
			String a = num1.substring(i, i + 1);
			if(a.equals("0")){
				continue;
			}
			for (int j = num2.length() - 1; j >= 0; j--) {
				String b = num2.substring(j, j + 1);
				int tmpSunNum = tmpSum[j + 1] == null ? 0 : Integer.valueOf(tmpSum[j + 1]);
				int t = Integer.valueOf(a) * Integer.valueOf(b) + tmpSunNum;
				if (t >= 10) {
					tmpSum[j + 1] = String.valueOf(t).substring(1, 2);
					tmpSum[j] = String.valueOf(t).substring(0, 1);
				} else {
					tmpSum[j + 1] = String.valueOf(t).substring(0, 1);
				}

			}
			//数组转为数字字符串
			String strSum = "";
			for (String s : tmpSum) {
				if (s != null)
					strSum += s;
			}
			for (int x = 0; x < num1.length() - 1 - i; x++) {
				strSum += "0";
			}
			sum = add(sum, strSum);
		}
		return sum;
	}

	/**
	 * 字符串之和
	 * @param num1
	 * @param num2
	 * @return
	 */
	private String add(String num1, String num2) {
		int maxlen = Math.max(num1.length(), num2.length());
		String[] charList = new String[maxlen + 1];
		
		for (int i = 0; i < maxlen; i++) {
			String num1i = null, num2i = null, sumi = charList[i];
			if (num1.length() - i - 1 >= 0)
				num1i = num1.substring(num1.length() - i - 1, num1.length() - i);
			if (num2.length() - i - 1 >= 0)
				num2i = num2.substring(num2.length() - i - 1, num2.length() - i);
			if (num1i == null)
				num1i = "0";
			if (num2i == null)
				num2i = "0";
			if (sumi == null)
				sumi = "0";
			int sum = Integer.valueOf(num1i) + Integer.valueOf(num2i) + Integer.valueOf(sumi);
			if (sum >= 10) {
				//进位
				charList[i] = String.valueOf(sum).substring(1, 2);
				charList[i + 1] = String.valueOf(sum).substring(0, 1);
			} else {
				charList[i] = String.valueOf(sum).substring(0, 1);
			}
		}
		String result = "";
		for (int i = charList.length - 1; i >= 0; i--) {
			if (charList[i] != null)
				result += charList[i];
		}
		return result;
	}

测试结果如下:

推荐阅读