適度な難易264
文字列のような2つの非負整数所与 num1
と num2
戻る num1
と num2
、その製品の製品には、文字列として表現されます。
例1:
入力: NUM1 =」3" 、 "2"、NUM2 = 出力: "6"
例2:
入力: NUM1 = "123"、NUM2 = "456" 出力:"56088"
説明:
num1
そして、num2
長さが110未満。num1
そして、num2
数字のみが含まれています0-9
。num1
そしてnum2
、それは数字のゼロ自体がある場合を除き、ゼロで開始していません。- 標準(例えばBigIntegerのような)多数のライブラリーの任意のタイプを使用しないまたは処理整数に直接入力します。
class Solution {
/**
* 计算形式
* num1
* x num2
* ------
* result
*/
// 计算结果
String res = "0";
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
// num2 逐位与 num1 相乘
for (int i = num2.length() - 1; i >= 0; i--) {
int carry = 0;
// 保存 num2 第i位数字与 num1 相乘的结果
StringBuilder temp = new StringBuilder();
// 补 0
for (int j = 0; j < num2.length() - 1 - i; j++) {
temp.append(0);
}
int n2 = num2.charAt(i) - '0';
// num2 的第 i 位数字 n2 与 num1 相乘
for (int j = num1.length() - 1; j >= 0 || carry != 0; j--) {
int n1 = j < 0 ? 0 : num1.charAt(j) - '0';
int product = (n1 * n2 + carry) % 10;
temp.append(product);
carry = (n1 * n2 + carry) / 10;
}
// 将当前结果与新计算的结果求和作为新的结果
res = addStrings(res, temp.reverse().toString());
}
return res;
}
/**
* 对两个字符串数字进行相加,返回字符串形式的和
*/
public String addStrings(String num1, String num2) {
StringBuilder builder = new StringBuilder();
int carry = 0;
for (int i = num1.length() - 1, j = num2.length() - 1;
i >= 0 || j >= 0 || carry != 0;
i--, j--) {
int x = i < 0 ? 0 : num1.charAt(i) - '0';
int y = j < 0 ? 0 : num2.charAt(j) - '0';
int sum = (x + y + carry) % 10;
builder.append(sum);
carry = (x + y + carry) / 10;
}
return builder.reverse().toString();
}
}