Java简单实现大数相加

Java简单实现大数相加

public class BigNumberAdd {

    /**
     * 假设两个都是正数
     * @param num1
     * @param num2
     * @return  num1 + num2
     */
    public static String add(String num1, String num2) {
        int m = num1.length();
        int n = num2.length();
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        int index1 = m - 1;
        int index2 = n - 1;
        while (carry != 0 || index1 >= 0 || index2 >= 0) {
            int a = 0;
            int b = 0;
            if (index1 >= 0) {
                a = num1.charAt(index1) - '0';
                index1--;
            }
            if (index2 >= 0) {
                b = num2.charAt(index2) - '0';
                index2--;
            }
            int tmp = (a + b + carry) % 10;
            carry = (a + b + carry) / 10;
            sb.append(tmp);
        }
        sb.reverse();
        return sb.toString();
    }

    /**
     * 比较num1 和 num2 两个谁的绝对值比较大
     * @param num1
     * @param num2
     * @return -1 : num2绝对值较大,
     * 0 : 两个绝对值一样大,
     * 1 : num1绝对值较大
     */
    public static int compareAbsoluteValue(String num1, String num2) {
        // TODO::先不考虑异常的输入
        String s1 = num1.charAt(0) == '-' ? num1.substring(1) : num1;
        String s2 = num2.charAt(0) == '-' ? num1.substring(1) : num2;
        if (s1.length() > s2.length()) {
            return 1;
        }
        else if (s1.length() < s2.length()) {
            return -1;
        }
        else {
            int n = s1.length();
            int index = 0;
            while (index < n) {
                if (s1.charAt(index) > s2.charAt(index)) {
                    return 1;
                }
                else if (s1.charAt(index) < s2.charAt(index)) {
                    return -1;
                }
                index++;
            }
        }
        return 0;
    }

    /**
     * 判断两个数是否同号
     * @param s1
     * @param s2
     * @return  如果同号,返回true;否则返回false
     */
    public static boolean isSameNumber(String s1, String s2) {
//        return (s1.charAt(0) <= '9' && s1.charAt(0) >= '0' && s2.charAt(0) <= '9' && s2.charAt(0) >= '0') ||
//                (s1.charAt(0) == '-' && s2.charAt(0) == '-');
        return isPositive(s1) == isPositive(s2);
    }

    /**
     * 默认两个都是正数,且num1 > num2
     * @param num1
     * @param num2
     * @return num1 - num2
     */
    public static String minus(String num1, String num2) {
        int m = num1.length();
        int n = num2.length();
        int carry = 0;
        int index1 = m - 1;
        int index2 = n - 1;
        StringBuilder sb = new StringBuilder();
        while (carry != 0 || index1 >= 0 || index2 >= 0) {
            int a = 0;
            int b = 0;
            if (index1 >= 0) {
                a = num1.charAt(index1) - '0';
                index1--;
            }
            if (index2 >= 0) {
                b = num2.charAt(index2) - '0';
                index2--;
            }
            int tmp = (a - b - carry);
            if (tmp < 0) {
                tmp += 10;
                carry = 1;
            }
            else {
                carry = 0;
            }
            sb.append(tmp);
        }
        sb.reverse();
        while (sb.length() > 0 && sb.charAt(0) == '0') {
            sb.deleteCharAt(0);
        }
        return sb.toString();
    }

    private static boolean isPositive(String num1) {
        return !(num1.charAt(0) == '-');
    }

    public static String addTwoBigNumber(String num1, String num2) {
        boolean isSame = isSameNumber(num1, num2);
        if (isSame) {
            boolean isPositive = isPositive(num1);
            if (isPositive) {
                return add(num1, num2);
            }
            else {
                return "-" + (add(num1.substring(1), num2.substring(1)));
            }
        }
        else {
            int compareResult = compareAbsoluteValue(num1, num2);
            if (compareResult == 0) {
                return "";
            }
            boolean isPositive = isPositive(num1);
            // num2绝对值比较大
            if (compareResult == -1) {
                // num1是正数
                if (isPositive) {
                    return "-" + minus(num2.substring(1), num1);
                }
                else {
                    return minus(num2, num1.substring(1));
                }
            }
            else {
                if (isPositive) {
                    return minus(num1, num2.substring(1));
                }
                else {
                    return "-" + minus(num1.substring(1), num2);
                }
            }
        }
    }
}
posted @ 2023-08-23 16:19  ZJHqs  阅读(104)  评论(0编辑  收藏  举报