【题目】
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 String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) return "0";
int[] table = new int[num1.length() + num2.length()];//存放乘积,低位存低位
int len = 0; //积的长度,用于转为字符串
for (int i = num1.length() - 1; i >= 0; i--) {
int digit1 = (int)(num1.charAt(i) - '0');
int carry = 0;
int k = num1.length() - 1 - i; //本轮乘积结果开始的位置
for (int j = num2.length() - 1; j >= 0; j--, k++) {
int digit2 = (int)(num2.charAt(j) - '0');
int res = digit1 * digit2; //位与位的乘积
res += table[k]; //加上上一轮乘积第k位的数
res += carry; //加上进位到第k位的数
table[k] = res % 10; //进位后剩余的数
carry = res / 10; //进位
}
//更新结果的长度
if (k - 1 > len) {
len = k - 1;
}
//如果最后进位不为0
if (carry > 0) {
table[k] += carry;
if (table[k] > 9) {
table[k + 1] = table[k] / 10;
table[k] %= 10;
k++;
}
if (k > len) { //更新结果的长度
len = k;
}
}
}
//把积转为字符串
String ans = "";
for (int i = len; i >= 0; i--) {
ans += String.valueOf(table[i]);
}
return ans;
}
}