难度:中等
频次:55
题目:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
解题思路: 拆出来的乘法最后的结果是string,最后用string+string得出string
注意:
- 前提先掌握字符串的相加
- string下的==和equals的区别
- 得反转
代码
class Solution {
public String multiply(String num1, String num2) {
// ==和equals的区别
if(num1.equals("0") || num2.equals("0")) return "0";
int len1=num1.length();
int len2=num2.length();
//每一行的计算结果
String sum="";
//都是从高位到低位
for(int i=len2-1;i>=0;i--){
StringBuilder temp=new StringBuilder();
//乘法进位
int carry=0;
//补0,因为后面后面会反转,所以放前面
for(int k=0;k<len2-i-1;k++){
temp.append('0');
}
int number2=num2.charAt(i)-'0';
for(int j=len1-1;j>=0||carry!=0;j--){
//进位
int number1=j<0?0:num1.charAt(j)-'0';
int a=(number1*number2+carry)%10;
temp.append(a);
carry=(number1*number2+carry)/10;
}
//最后记得反转
sum=add(sum,temp.reverse().toString());
}
return sum;
}
public String add(String num1,String num2){
int len1=num1.length()-1;
int len2=num2.length()-1;
StringBuilder sum=new StringBuilder();
int i=0;
int carry=0;
while(len1>=0||len2>=0||carry!=0){
//这里只需要单独判断就行了,不需要放一起
int temp1=len1>=0?num1.charAt(len1)-'0':0;
int temp2=len2>=0?num2.charAt(len2)-'0':0;
sum.append((temp1+temp2+carry)%10);
carry=(temp1+temp2+carry)/10;
len2--;
len1--;
}
//最后记得反转
return sum.reverse().toString();
}
}