计算两个大数相加

计算两个大数相加

计算两个大数相加,可以使用以下两种方法

  1. 使用 Java 自带的 BigInteger
import java.math.BigInteger;

/**
 * Main []
 *
 * @author RunBrick <zhouwei9280@gmail.com>
 * @version 1.0.0
 * @description "下面的例子返回的结果为:18446744073709551616"
 */
public class Main {
    public static void main(String[] args) {
        BigIntAdd bigIntAdd = new BigIntAdd("9223372036854775808", "9223372036854775808");
        System.out.println(bigIntAdd.add());
    }
}

/**
 * BigIntAdd [使用 BigInteger 方法的大数相加]
 *
 * @author RunBrick <zhouwei9280@gmail.com>
 * @version 1.0.0
 * @description ""
 */
class BigIntAdd {
    private String first;
    private String second;

    public BigIntAdd(String first, String second) {
        this.first = first;
        this.second = second;
    }

    public String add() {
        BigInteger firstB = new BigInteger(first);
        BigInteger secondB = new BigInteger(second);
        BigInteger add = firstB.add(secondB);
        // 这里我为了方便直接转成了 string 如果有需要可以直接返回 BigInteger
        return add.toString();
    }
}

  1. 使用算法实现
/**
 * Main []
 *
 * @author RunBrick <zhouwei9280@gmail.com>
 * @version 1.0.0
 * @description "下面的例子返回的结果为:18446744073709551616"
 */
public class Main {
    public static void main(String[] args) {
        BigIntAdd bigIntAdd = new BigIntAdd("9223372036854775808", "9223372036854775808");
        System.out.println(bigIntAdd.add());
    }
}

/**
 * BigIntAdd [使用 算法 的大数相加]
 *
 * @author RunBrick <zhouwei9280@gmail.com>
 * @version 1.0.0
 * @description ""
 */
class BigIntAdd {
    private String first;
    private String second;

    public BigIntAdd(String first, String second) {
        this.first = first;
        this.second = second;
    }

    public String add() {

        // 首先判断两个数位的大小
        int max = Math.max(first.length(), second.length());
        // 创建一个 StringBuilder,如果直接使用 + 来拼接字符串这样每次系统都会创建一个新的字符串对象
        // 使用 StringBuilder 可以创建获得一个被分配好的缓冲区这样不用每次都要创建一个字符串对象了
        // 这里也可以使用 StringBuffer,但是如果不是需要线程安全的方法完全可以使用 StringBuilder 替代
        // 顺便判断一下当前两个大数的位数固定一下 StringBuilder 的容量。
        StringBuilder sum = new StringBuilder(max + 1 > 2 ? max + 1 : 3);

        // 反转字符串,因为相加要从各位开始计算所以让两个字符串反转过来便于相加
        String s = (new StringBuilder(first)).reverse().toString();
        String s1 = (new StringBuilder(second)).reverse().toString();
        // 定义一个下次计算需要进位的数,加法极限也就是 1 了
        int digits = 0;
        for (int i = 0; i < max; i++) {
            // 给定两个临时的数
            int tmpFirst = i > s.length() - 1 ? 0 : s.charAt(i) - '0';
            int tmpSecond = i > s1.length() - 1 ? 0 : s1.charAt(i) - '0';
            int tmpSum = tmpFirst + tmpSecond + digits;
            //使用之后要先归零不然下次加的时候还是上次用的 digits
            digits = 0;
            if (tmpSum > 9) {
                // 更改下次要进的位数为1,因为加法进位不会超过 1 的
                digits = 1;
                // 因为十位上进了1,所以剩下的我们要取临时sum上的余数
                sum.append(tmpSum % 10);
            } else {
                sum.append(tmpSum);
            }
        }
        if (digits == 1) {
            sum.append(1);
        }
        // 在反转过来,返回成 String 类型
        return sum.reverse().toString();
    }
}


# Java 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×