java - 我的大整数计算器没有按计划工作,任何 java 开发人员都可以帮助我吗?

标签 java calculator biginteger

我正在为我的计算机科学类(class)制作一个大整数计算器,但我添加的一些东西不起作用。基本上据我所知,它只适用于 100 及以下的数字(也可能适用于 999 及以下的数字)。具体来说,我正在努力解决的是,当添加 934 + 168 时,它总是得到 10102,而不是 1102。我之前已经将这个加起来,但在尝试解决其他问题的过程中,它不再起作用了。如果有人能够通过告诉我可能出错的地方来帮助我修复代码,请这样做。谢谢!

public static void main(String[] args) {
    System.out.println("Please enter a positive integer.");
    LinkedList a = takeData();
    System.out.println("Please enter another positive integer.");
    LinkedList b = takeData();
    LinkedList<Integer> sum = add(a, b);
    //System.out.println("They add to equal:\t");
    print(sum);
}


public static LinkedList<Integer> add(LinkedList<Integer> a, LinkedList<Integer> b) {
    LinkedList<Integer> sum = new LinkedList<Integer>();
    int decide = 0, s = 0;
    ;
    if (a.size() == b.size())
        decide = 1;
    fillWithZeros(a, b, sum);
    print(a);
    print(b);
    if (decide == 1)
        s = a.size() + 1;
    else
        s = a.size();
    int add = 0, count = 0;

    for (int x = 0; x < s; x++) {
        count = 0;
        add = 0;
        if (x != s && decide == 0 || decide == 1 && x != s - 1)
            add = a.pollLast() + b.pollLast();
        if (sum.size() != 0)
            add += sum.getFirst();
        if (add >= 10) {
            add -= 10;
            //if(sum.size()>0)
            //add+=sum.get(0);
            sum.addFirst(0);
            sum.addFirst(1);
            count++;
            //if(sum.size()>=2) THIS DOES NOTHING
            //add+= sum.get(1);
        }
        System.out.println("\nThe " + x + " digit equals = " + add);
        System.out.println("x = " + x + "\nsum.size = " + sum.size());
           /* if(sum.size()>s-1 && decide==1)
            {
                System.out.println("YOu stopperd here");
            return sum;
        }*/
        if (x != 0) {
            if (sum.size() >= x) {
                add += sum.get(1);


                if (add >= 10) {
                    add -= 10;
                    sum.addFirst(0);
                    sum.addFirst(1);
                    if (sum.size() >= 2)
                        add += sum.get(1);
                    //add-=10;
                    //sum.addFirst(1);
                    sum.set(1, add);
                } else {
                    sum.set(1, add);
                }

                System.out.println(add);

                //sum.set(0,add);
                //}
                //sum.add(x-1,add);
                //sum.add(add);
            } else {
                //add+= sum.get(x-1);
                if (count == 0)
                    sum.set(0, add);
                else
                    sum.set(1, add);
            }
        } else
            sum.addLast(add);
        print(sum);
        if (sum.size() > s - 1 && decide == 1)
            return sum;

    }


    return sum;
}

public static void print(LinkedList<Integer> a) {
    System.out.println("\nSize of LinkList:\t" + a.size());
    for (int x = 1; x <= a.size(); x++)
        System.out.print(a.get(x - 1));
}

public static void fillWithZeros(LinkedList<Integer> a, LinkedList<Integer> b, LinkedList<Integer> c) {
    while (b.size() != a.size()/*||c.size()!=b.size()*/) {
        if (a.size() > b.size())
            b.addFirst(0);
        else if (a.size() < b.size())
            a.addFirst(0);
        /*else
            c.addFirst(0);*/
    }
    /*c.addFirst(0);*/
}

public static LinkedList<Integer> takeData() {
    boolean correctData = true;
    Scanner read = new Scanner(System.in);
    LinkedList list = new LinkedList();
    do {
        if (correctData == false)
            System.out.println("Please re-enter a correct integer.");
        String n = read.nextLine();
        for (int x = 0; x < n.length(); x++) {
            if (Character.isDigit(n.charAt(x))) {

                int valueOf = n.charAt(x) - 48;
                list.add(valueOf);

            } else {
                correctData = false;
                break;
            }
            correctData = true;
        }

    } while (correctData == false);

    return list;
}

最佳答案

您应该像在纸上一样添加数字,即从最后一位数字开始,将它们相加,并在需要时保留 1。

使用 Iterator 迭代列表,您可能已经知道可以这样做:

Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
    int digit = iter.next();
    // use digit here
}

一个ListIterator可以做同样的事情,但也可以向后迭代:

ListIterator<Integer> iter = list.listIterator(list.size()); // start at end
while (iter.hasPrevious()) {
    int digit = iter.previous(); // iterate backwards
    // use digit here
}

LinkedList类也非常适合向后构建结果,因为除了 add() ,它还有addLast() (做同样的事情),以及 addFirst() ,我们可以用它来构建从最后一位数字开始的结果。

了解了所有这些之后事情就变得非常简单,如下所示:

public static LinkedList<Integer> add(LinkedList<Integer> a, LinkedList<Integer> b) {
    LinkedList<Integer> sum = new LinkedList<>();
    int carry = 0;
    ListIterator<Integer> aIter = a.listIterator(a.size());
    ListIterator<Integer> bIter = b.listIterator(b.size());
    while (carry != 0 || aIter.hasPrevious() || bIter.hasPrevious()) {
        int digitSum = carry;
        if (aIter.hasPrevious())
            digitSum += aIter.previous();
        if (bIter.hasPrevious())
            digitSum += bIter.previous();
        if (digitSum <= 9) {
            carry = 0;
        } else {
            carry = 1;
            digitSum -= 10;
        }
        sum.addFirst(digitSum);
    }
    return sum;
}

关于java - 我的大整数计算器没有按计划工作,任何 java 开发人员都可以帮助我吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64831220/

相关文章:

sqlite - 计算当月星期几的第一天和最后一天

Java BigInteger bitLength() 方法忽略前导 0 位

c# - 平方根的快速逼近?

java - 无法从 src/main/java 调用 src/test/java 内的代码?

java - 瓷砖 3 : get current definition name inside a JSP

swift - 如何在 Swift 中进行数字相乘?

c++ - 使用命令行参数 C++ 的简单计算器

java - JUNIT : run setup only once for a large number of test classes

java - 如何在Java中传递uint?

java - 计算一系列数字的 LCM 的最有效算法是什么?