java大数加法的一种思路

发布时间 2023-04-11 10:44:32作者: 李八御
package org.example;


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class SuperNum {

    public List<Integer> numList;

    /**
     * 成员变量的set方法
     * @param numList
     */
    public void setNumList(List<Integer> numList) {
        this.numList = numList;
    }

    /**
     * 从键盘输入
     */
    public void inputNumList() {
        this.numList = new ArrayList<>();
        System.out.println("请输入数字");

        Scanner sc = new Scanner(System.in);
        String inputString = sc.nextLine();

        for (int i = 0; i < inputString.length(); i++) {
            int n = Integer.parseInt(String.valueOf(inputString.charAt(i)));
            numList.add(0, n);
        }
    }

    /**
     * 输出存储的数字
     */
    public void printNum() {

        for (int i = this.numList.size()-1; i >= 0; i--) {
            System.out.print(this.numList.get(i));
        }
        System.out.println();
    }
}

public class Main {

    public static SuperNum SumSuperNum(SuperNum num1, SuperNum num2) {

        List<Integer> numList1 = num1.numList;
        List<Integer> numList2 = num2.numList;
        List<Integer> newList = new ArrayList<>();

        int minLen = Math.min(numList1.size(), numList2.size());

        int temp = 0; // 进位标记
        int thisNum;

        // 从个位起相加
        for (int i = 0; i < minLen; i++) {
            thisNum = numList1.get(i) + numList2.get(i) + temp;
            // 还原进位标记
            temp = 0;

            if (thisNum >= 10) {
                // 需要进位
                temp = 1;
                thisNum = thisNum - 10;
                newList.add(thisNum);
            } else {
                // 不需要进位
                temp = 0;  // 还原进位标记
                newList.add(thisNum);
            }
        }

        // 处理剩余数字
        List<Integer> remainNum = numList1.size() > numList2.size() ? numList1 : numList2;
        for (int i = minLen; i < remainNum.size(); i++) {
            thisNum = remainNum.get(i) + temp;
            // 还原进位标记
            temp = 0;

            if (thisNum >= 10) {
                // 需要进位
                temp = 1;
                thisNum = thisNum - 10;
                newList.add(thisNum);
            } else {
                // 不需要进位
                temp = 0;  // 还原进位标记
                newList.add(thisNum);
            }
        }

        SuperNum resultNum = new SuperNum();
        resultNum.setNumList(newList);

        return resultNum;
    }

    public static void main(String[] args) {

        SuperNum superNum1 = new SuperNum();
        superNum1.inputNumList();

        SuperNum superNum2 = new SuperNum();
        superNum2.inputNumList();

        SuperNum Result = SumSuperNum(superNum1, superNum2);
        System.out.print("求和结果 = ");
        Result.printNum();
    }
}


/**
 *
 * 42846280183517070527831839425882145521227251250327
 * 55121603546981200581762165212827652751691296897789
 * 97967883730498271109594004638709798272918548148116
 */