我的大整数计算器没有按计划工作,有java开发人员能帮我吗?

f5emj3cl  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(434)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

上个月关门了。
改进这个问题
我正在为我的comp-sci课程做一个大整数计算器,但是我加在一起的一些东西不起作用。基本上,据我所知,它只适用于数字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;
}
jgwigjjp

jgwigjjp1#

你应该像在纸上一样添加数字,也就是说,从最后的数字开始,添加数字,如果需要的话,再加上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;
}

相关问题