不使用BigInteger类实现大数相加(Java)

Posted xuyiqing

tags:

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

package add;

import java.math.BigInteger;

public class BigAdd {
    public static String bigadd(String n1, String n2) {
        // 字符串缓存区:提高字符串操作效率
        StringBuffer result = new StringBuffer();
        // 反转字符串
        n1 = reverse(n1);
        n2 = reverse(n2);
        // 最大长度
        int len1 = n1.length();
        int len2 = n2.length();
        // 最大长度
        int maxLen = max(len1, len2);
        // 是否需要进位
        boolean over = false;
        // 短字符串的高位用0补齐
        cover(n1, n2, len1, len2);

        for (int i = 0; i < maxLen; i++) {
            // 每一位相加
            int nSum = changeToint(n1, i) + changeToint(n2, i);
            if (nSum < 9) {
                // 上一次有进位
                if (over = true) {
                    if (nSum == 9) {
                        result.append(0);
                    } else {
                        result.append(nSum + 1);
                        // 取消进位
                        over = false;
                    }
                } else {
                    result.append(nSum);
                }
            } else {
                if (over == true) {
                    result.append(nSum - 10 + 1);
                } else {
                    result.append(nSum - 10);
                    over = true;
                }
            }
        }
        // 最后是否还有进位
        if (over == true) {
            result.append(1);
        }

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

    public static String reverse(String n) {
        n = new StringBuffer(n).reverse().toString();
        return n;
    }

    public static int max(int a, int b) {
        return a > b ? a : b;
    }

    public static int changeToint(String n, int i) {
        // 加""将字符转为String
        return Integer.parseInt(n.charAt(i) + "");
    }

    public static void cover(String n1, String n2, int len1, int len2) {
        if (len1 < len2) {
            for (int i = len1; i < len2; i++) {
                n1 += "0";
            }
        } else if (len1 > len2) {
            for (int i = len2; i < len1; i++) {
                n2 += "0";
            }
        }
    }

    // 测试
    public static void main(String[] args) {
        String n1 = "666666666666666666";
        String n2 = "696969696969696969";
        String n = bigadd(n1, n2);
        System.out.println(n);

        // 用BigInteger类验证
        BigInteger b1 = new BigInteger(n1);
        BigInteger b2 = new BigInteger(n2);
        System.out.println(b1.add(b2));

    }
}

 

以上是关于不使用BigInteger类实现大数相加(Java)的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 大数类

Java中的大数处理类BigInteger和BigDecimar浅析

算法:如何实现两个大数相加

算法:如何实现两个大数相加

算法:如何实现两个大数相加

Java 大数类BigInteger和BigDecimal的基本函数