题意:给两个十进制字符串,求出两数相乘得到的结果字符串
思路:字符串长度太大,而且用BigInteger做这题就没意思了,所以只能按照乘法法则模拟。首先模拟两字符串数相加过程,之后模拟多位和个位相乘过程,之后按照位数往后添0相加得到总和就是结果
class Solution {
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0"))
return "0";
int j = num2.length()-1;
String ans = "0", s2;
int cnt = 0;
while (j >= 0) {
s2 = "";
int y = num2.charAt(j)-'0', flag = 0;
for (int i = num1.length()-1; i >= 0; i--) {
int x = num1.charAt(i)-'0', num = x*y;
if (num%10+flag >= 10) {
s2 = (num%10+flag-10) + s2;
flag = num/10+1;
} else {
s2 = (num%10+flag) + s2;
flag = num/10;
}
}
if (flag != 0)
s2 = flag + s2;
for (int i = 0; i < cnt; i++)
s2 += "0";
cnt++;
ans = add(ans, s2);
j--;
}
return ans;
}
public String add(String num1, String num2) {
int i = num1.length()-1, j = num2.length()-1;
String ans = "";
boolean flag = false;
while (i >= 0 || j >= 0) {
if (i < 0) {
int x = num2.charAt(j)-'0';
if (flag && x+1 >= 10) {
ans = (x-9) + ans;
} else if (flag) {
ans = (x+1) + ans;
flag = false;
} else {
ans = x + ans;
}
} else if (j < 0) {
int x = num1.charAt(i)-'0';
if (flag && x+1 >= 10) {
ans = (x-9) + ans;
} else if (flag) {
ans = (x+1) + ans;
flag = false;
} else {
ans = x + ans;
}
} else {
int x = num1.charAt(i)-'0', y = num2.charAt(j)-'0', sum = x + y;
if (sum >= 10) {
if (flag) {
ans = (sum-9) + ans;
} else {
ans = (sum-10) + ans;
flag = true;
}
} else {
if (flag && sum+1 >= 10) {
ans = (sum-9) + ans;
} else if (flag) {
ans = (sum+1) + ans;
flag = false;
} else {
ans = sum + ans;
}
}
}
i--; j--;
}
if (flag) {
ans = "1" + ans;
}
return ans;
}
}