题目描述
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:输入: num1 = “123”, num2 = “456”
输出: “56088”提示:
1 <= num1.length, num2.length <= 200
num1 和 num2 只能由数字组成。
num1 和 num2 都不包含任何前导零,除了数字0本身。
做题思路
想想一下,我们在小学做两个大数相乘的时候的竖式
1 2 3 乘 4 5 -------------- 6 1 5 式a 4 9 2 式b -------------- 5 5 3 5
本题我就是按照小学的思路来求解的
- 先求出乘数的每一位与被乘数相乘得到一个数
- 最后将所有的 ‘中间结果’ 相加 就可以得到最终的结果了
但是需要注意一些细节:
比如说在最后算完之后,进位是否大于0?
如果大于0的话还需要继续算进去
刚开始的时候我们就需要判断字符串中是否存在0值
存在的话直接返回就可以,就不必接下来的运算
注意我上面写的运算式子,注意看式b
式b的最右边,我虽然没有写任何东西,但是实际上 最右边默认有一个 0值的
也就是:4920
我们知道:乘数从右到左每提出一位将要进行计算的元素的时候,都需要默认的往前进一位,后米娜的位数都需要默认的用0来补充
代码实现
class Solution {
public String multiply(String num1, String num2) {
if(num1.equals("0")|| "0".equals(num2)){
return "0";
}
int n1=num1.length();
int n2=num2.length();
String res="0";
for(int i=n2-1;i>=0;i--){
StringBuilder sb=new StringBuilder();
for(int j=n2-1;j>i;j--){
sb.append(0);
}
int up=0;
for(int k=n1-1;k>=0;k--){
int ns2=num2.charAt(i)-'0';
int ns1=num1.charAt(k)-'0';
sb.append((ns1*ns2 + up)%10 + "" );
up=(ns2*ns1 + up)/10;
}
if(up!=0){
sb.append(""+up);
}
res=addString(res,sb.reverse().toString());
// 921 * 3
}
return res;
}
public String addString(String a,String b){
int up=0;
int i=a.length()-1;
int j=b.length()-1;
StringBuilder sb=new StringBuilder();
int nu1=0;
int nu2=0;
while( i>=0 || j>=0 || up!=0 ){
if(i<0){
nu1=0;
}else{
nu1=a.charAt(i)-'0';
}
if(j<0){
nu2=0;
}else{
nu2=b.charAt(j)-'0';
}
sb.append((nu1+nu2+up)%10 +"");
up=(nu1+nu2+up)/10;
i--;
j--;
}
return sb.reverse().toString();
}
}