import java.math.BigInteger;
public class Solution {
//解法1
public String multiply(String num1, String num2) {
if (num1 == null || num1.length() == 0 || (num1.length() == 1 && num1.trim().equals("0")) || num2 == null || num2.length() == 0 || (num2.length() == 1 && num2.trim().equals("0")))
return "0";
int starti = num1.charAt(0) == '-' ? 1 : 0;
int startj = num2.charAt(0) == '-' ? 1 : 0;
boolean negative = false;
if ((starti == 1 && startj == 0) || (starti == 0 && startj == 1)) {
negative = true;
}
if (num1.charAt(0) == '-')
num1 = num1.substring(1);
if (num2.charAt(0) == '-')
num2 = num2.substring(1);
int total = 0;
int[] result = new int[num1.length() + num2.length()];
for (int i = num1.length() - 1; i >= 0; i--) {
int carry = 0;
for (int j = num2.length() - 1; j >= 0; j--) {
total = result[i + j + 1] + (num1.charAt(i) - '0') * (num2.charAt(j) - '0') + carry;
result[i + j + 1] = total % 10;
carry = total / 10;
}
result[i] += carry;
}
int start = result[0] == 0 ? 1 : 0;
StringBuilder sb = new StringBuilder();
while (start < result.length) {
sb.append(result[start++]);
}
if (negative) {
return "-" + sb.toString();
} else {
return sb.toString();
}
}
//解法2
public String multiply2(String num1, String num2) {
if (num1 == null || num1.length() == 0 || (num1.length() == 1 && num1.trim().equals("0")) || num2 == null || num2.length() == 0 || (num2.length() == 1 && num2.trim().equals("0")))
return "0";
int r = 0;
int[] result = new int[1000];
char[] nums1 = num1.toCharArray();
char[] nums2 = num2.toCharArray();
int starti = nums1[0] == '-' ? 1 : 0;
int startj = nums2[0] == '-' ? 1 : 0;
int startIndex = 0;
for (int i = num1.length() - 1; i >= starti; i--) {
int sum = 0;
int mulSum = 0;
int k = 0;
int[] temp = new int[1000];
for (int j = num2.length() - 1; j >= startj; j--) {
mulSum = sum + (nums1[i] - '0') * (nums2[j] - '0');
temp[k++] = mulSum % 10;
sum = mulSum / 10;
}
if (sum > 0) {
temp[k++] = sum;
}
r = add(result, r, temp, k, startIndex++);
}
StringBuilder sb = new StringBuilder();
for (int p = r - 1; p >= 0; p--) {
sb.append(result[p]);
}
if ((nums1[0] == '-' && nums2[0] != '-') || (nums2[0] == '-' && nums1[0] != '-')) {
return "-" + sb.toString();
} else {
return sb.toString();
}
}
public int add(int[] result, int r, int[] nums, int k, int startIndex) {
int i = startIndex;
int j = 0;
int index = startIndex;
int sum = 0;
int d1, d2;
while (i < r || j < k || sum > 0) {
d1 = i < r ? result[i] : 0;
d2 = j < k ? nums[j] : 0;
sum += d1 + d2;
result[index++] = sum % 10;
sum /= 10;
i++;
j++;
}
return index;
}
public static void main(String[] args) {
String a = "-123";
String b = "456";
System.out.println(new Solution().multiply(a, b));
System.out.println(new BigInteger(a).multiply(new BigInteger(b)));
}
}
[参考]
https://discuss.leetcode.com/topic/9449/brief-c-solution-using-only-strings-and-without-reversal