【题目】
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; } }
时间: 2024-11-08 03:34:24