題目描述
給定兩個以字符串形式表示的非負整數 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();
}
}