大整数相乘

来源:互联网 发布:linux下php言编程ide 编辑:程序博客网 时间:2024/06/06 02:53
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

0 0
原创粉丝点击