java大整数相加

Posted 金色元年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java大整数相加相关的知识,希望对你有一定的参考价值。

-- 正整数相加

/*
 * description: 1. 反转 2. 补0 3. 计算 4. 最后结果反转
 * @author maduar
 * @date 21/11/2018 10:15 PM
 * @email [email protected]
 *
 * */
public class MaxNum {

    private MaxNum() {
    }

    public static String sumMaxNumber(String numberA, String numberB) {

        // 校验空傎
        if (!isAllNum(numberA) || !isAllNum(numberB)) {
            return null;
        }

        // 反转
        numberA = reverseString(numberA);
        numberB = reverseString(numberB);

        String maxString = getMaxLengthString(numberA, numberB);
        String minString = getMinLengthString(numberA, numberB);

        // 补0
        int maxLength = maxString.length();
        int minLength = minString.length();

        if (maxLength > minLength) {
            minString = getMoreZero(minString, maxLength);
        }

        // 获取sum
        return getSumNumber(maxString, minString, maxLength);
    }

    // 判断字符是否为空
    public static boolean isBlank(String str) {
        return str == null || "".equals(str);
    }

    // 反转字符串
    public static String reverseString(String str) {
        return new StringBuilder(str).reverse().toString();
    }

    // 获取长度较大的字符
    public static String getMaxLengthString(String numberA, String numberB) {
        return numberA.length() > numberB.length() ? numberA : numberB;
    }

    // 获取长度较小的字符
    public static String getMinLengthString(String numberA, String numberB) {
        return numberA.length() > numberB.length() ? numberB : numberA;
    }

    // 反转后补0
    public static String getMoreZero(String str, int maxLen) {

        int strLen = str.length();
        int addLen = maxLen - strLen;

        if (addLen < 1) {
            return str;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < addLen; i++) {
            sb.append("0");
        }
        return str + sb.toString();
    }

    // 反转后,获取sum
    public static String getSumNumber(String maxString, String minString, int maxLength) {
        int[] resultArray = new int[maxLength + 1];
        int[] maxStringArray = stringToIntArray(maxString);
        int[] minStringArray = stringToIntArray(minString);

        int temp = 0;
        for (int i = 0; i < maxLength; i++) {

            // a1 + b1 + c1
            temp = maxStringArray[i] + minStringArray[i] + resultArray[i];
            if (temp > 9) {
                resultArray[i] = temp % 9;
                // 结果大于9,进位1
                resultArray[i + 1] = 1;
            } else {
                resultArray[i] = temp;
            }
        }


        StringBuilder maxNumberS = new StringBuilder();
        for (int i = 0; i < maxLength; i++) {
            maxNumberS.append(resultArray[i]);
        }

        // 判断最后一位是否有进位,有则保留
        if (resultArray[maxLength] != 0) {
            maxNumberS.append(resultArray[maxLength]);
        }

        return maxNumberS.reverse().toString();
    }

    // #char to int
    public static int stringCharToInt(char ch) {
        int result = (int) ch - 48;
        if (result < 0) {
            result = 0;
        }
        return result;
    }

    // 判断字符串是不是全数字
    public static boolean isAllNum(String s) {

        if (isBlank(s)) {
            return false;
        }

        int cursor = 0;

        int len = s.length();
        while (cursor < len &&
                Character.isDigit(s.charAt(cursor))) {
            cursor++;
        }

        if (cursor == len) {
            return true;
        }

        return false;
    }

    public static int[] stringToIntArray(String str) {

        int cursor = 0;
        int len = str.length();
        int[] arr = new int[len];

        while (cursor < len) {
            arr[cursor] = (int) str.charAt(cursor) - 48;
            cursor++;
        }

        return arr;
    }
}

  

 

 

-- test

/*
 * description:
 * @author maduar
 * @date 21/11/2018 10:16 PM
 * @email [email protected]
 *
 * */
public class MaxNumTest {

    @Test
    public void testBigInteger() {
        String numberA = "66666666666666666666666";
        String numberB = "2222222222222222222222";

        BigInteger a = new BigInteger(numberA);
        BigInteger b = new BigInteger(numberB);

        String result = "68888888888888888888888";
        String testResult = a.add(b).toString();

        Assert.assertEquals(result, testResult);
    }

    @Test
    public void testSumMaxNumber() {

        String numberA = "66666666666666666666666";
        String numberB = "2222222222222222222222";
//        String numberA = "123456";
//        String numberB = "54321";

        String numberC = MaxNum.sumMaxNumber(numberA, numberB);

        String result = "68888888888888888888888";
//        String result = "177777";

        Assert.assertEquals(result, numberC);
    }

    @Test
    public void testCheckStr() {
        String a = "";
        String b = null;
        String c = "1";
        String d = "1a";

        Assert.assertFalse(MaxNum.isAllNum(a));
        Assert.assertFalse(MaxNum.isAllNum(b));
        Assert.assertFalse(MaxNum.isAllNum(d));

        Assert.assertTrue(MaxNum.isAllNum(c));
    }

    @Test
    public void testIsBlank() {
        String a = "";
        String b = null;
        String c = "1";

        Assert.assertTrue(MaxNum.isBlank(a));
        Assert.assertTrue(MaxNum.isBlank(b));
        Assert.assertFalse(MaxNum.isBlank(c));
    }

    @Test
    public void testReverseString() {
        String a = "12345";
        String b = MaxNum.reverseString(a);
        String result = "54321";

        Assert.assertEquals(result, b);
    }

    @Test
    public void testGetMaxLengthString() {
        String a = "12345";
        String b = "12";

        String result = "12345";
        Assert.assertEquals(result, MaxNum.getMaxLengthString(a, b));

    }

    @Test
    public void testGetMinLengthString() {
        String a = "12345";
        String b = "12";

        String result = "12";
        Assert.assertEquals(result, MaxNum.getMinLengthString(a, b));
    }

    @Test
    public void getGetMoreZero() {
        String a = "123";
        int len = 5;

        String result = "12300";

        Assert.assertEquals(result, MaxNum.getMoreZero(a, len));
    }

    @Test
    public void testGetSumNumber() {
        String numberA = "666";
        String numberB = "220";

        int len = numberA.length();
        String result = "688";

        Assert.assertEquals(result, MaxNum.getSumNumber(numberA, numberB, len));
    }

    @Test
    public void testStringCharToInt() {
        char a = ‘6‘;
        int result = 6;

        Assert.assertEquals(result, MaxNum.stringCharToInt(a));
    }

    @Test
    public void testIsAllNum() {
        String numberA = "66666666666666666666666";
        String numberb = "6666666666666666666666a";

        Assert.assertTrue(MaxNum.isAllNum(numberA));
        Assert.assertFalse(MaxNum.isAllNum(numberb));

    }
}

  

 

以上是关于java大整数相加的主要内容,如果未能解决你的问题,请参考以下文章

用JAVA线性表来编写“任意大的整数相加减”

C语言两个特别大的整数类型相加超出范围使用两个技巧

如何实现大整数相加

大整数相加问题

实现大整数相加(考虑符号位,可能有负整数) 思维严谨程度!!

实现大整数相加