题目描述
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3” 输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456” 输出: “56088”
说明:
- num1 和 num2 的长度小于110。
- num1 和 num2 只包含数字 0-9。
- num1 和 num2 均不以零开头,除非是数字 0 本身。
- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
思路
先将字符串转换为字符数组,然后将字符数组转为int[],然后用其中一个乘数的每一位去乘以另一个乘数的,然后错位相加,注意进位。特别需要注意的是两个输入的字符串有一个全为0的情况,这个时候计算的结果为0,但是本题的结果需要做个调整,两个乘数位数少的那个乘数的位数为n,如果结果为0,返回的结果应该为n个0的字符串。
代码
class Solution {
public String multiply(String num1, String num2) {
char[] num2char1 = num1.toCharArray();
char[] num2char2 = num2.toCharArray();
//两数相乘结果的长度最多也不会超过两数的长度之和
int resultLen = num2char1.length + num2char2.length;
//用于存储过程结果
int[] result2Array = new int[resultLen];
//转换为数字
for(int i = 0; i < num2char1.length;++ i){
num2char1[i] -= '0';
}
for(int i = 0; i < num2char2.length;++ i){
num2char2[i] -= '0';
}
for(int i = num2char2.length - 1; i >= 0 ;--i){
int carry = 0;
for(int j = num2char1.length-1;j >=0; --j){
int temp = num2char2[i] * num2char1[j];
result2Array[i + j + 1] = result2Array[i + j + 1] + temp + carry;
carry = result2Array[i + j + 1] / 10;
result2Array[i + j + 1] %= 10;
}
int k = i ;
while(carry > 0){
result2Array[k] += carry;
carry = result2Array[k] / 10;
result2Array[k] %= 10;
k --;
}
}
StringBuilder sb = new StringBuilder();
int cal = 0;
for(cal = 0; cal < result2Array.length; ++cal){
if(result2Array[cal] != 0)
break;
}
for(int i = cal; i < result2Array.length; ++i){
sb.append(result2Array[i]);
}
if(cal == result2Array.length){
int figures = num1.length() > num2.length() ? num2.length() : num1.length();
for(int i = 0 ; i < figures; ++i){
sb.append(0);
}
}
return sb.toString();
}
}