题目
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
运用到的小知识点:
- SpringBuilder的拼接与翻转 很方便
- 在计算时只能一位数×一位数,所以 进位要暂时存放在 carry变量里,
- 当前temp=(n1*n2+carry)%10; 把temp值拼接到字符串之后,最后进行翻转即可
- 新的carry =(n1*n2+carry)/10;
代码
public static void main(String[] args) {
String string = multiply("123456789", "987654321");
System.out.println(string);
//System.out.println(123456789*3);
}
public static String multiply(String num1, String num2) {
if(num1.equals("0")||num2.equals("0")){
return "0";
}
int carry = 0;String sum = "0";
List<String> list = new ArrayList<String>();
int[] res = new int[num2.length()];
for (int i = num2.length()-1,n=0; i >= 0 ; i--,n++) {
//每次进行新的运算,carry值都要清0
carry=0;
int n1 = num2.charAt(i)-'0';
System.out.println("n1=--->"+n1);
StringBuilder sBuilder = new StringBuilder();
for (int j = num1.length()-1; j >= 0; j--) {
int n2 = num1.charAt(j)-'0';
int temp = (n1*n2+carry)%10;
sBuilder.append(temp);
carry=(n1*n2+carry)/10;
//当乘到最后一位时,需要把进位也拼接到后面
if(j==0){
if(carry!=0){
sBuilder.append(carry);
}
}
}
sBuilder = sBuilder.reverse();
for (int j = 0; j < n; j++) {
sBuilder.append(0);
}
list.add(sBuilder.toString());
System.out.println(sBuilder);
sum=addStrings(sum,sBuilder.toString());
}
return sum+"";
}
/**
* 对两个字符串数字进行相加,返回字符串形式的和
*/
public static 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();
}