【发布时间】:2017-03-03 17:45:20
【问题描述】:
好的,所以我被分配了一个使用堆栈的练习。这个任务的挑战是创建一个程序,可以在不使用任何库或导入(例如,没有 BigInteger)的情况下添加和减去非常大的整数(可能是无限大小)。
这就是我处理加法的方式:
public Stack<Integer> sum(Stack<Integer> leadingStack, Stack<Integer> secondStack) {
int carry = 0;
Stack<Integer> resultStack = new Stack<Integer>();
while (leadingStack.isEmpty() == false && secondStack.isEmpty() == false) {
int result = 0;
int dig1 = leadingStack.pop();
int dig2 = secondStack.pop();
int resultDig = 0;
result = dig1 + dig2 + carry;
resultDig = result % 10;
carry = result / 10;
resultStack.push(resultDig);
}
if (carry > 0)
resultStack.push(carry);
return resultStack;
}
此方法似乎适用于某些整数,而不适用于其他整数。例如,如果我输入 500 和 450,我会按预期得到 950。但是,如果我输入 500 和 45,我会得到 45。
这就是我处理减法的方法(非常相似的方法):
public Stack<Integer> sub(Stack<Integer> leadingStack, Stack<Integer> secondStack) {
boolean borrow = false;
Stack<Integer> resultStack = new Stack<Integer>();
while (leadingStack.isEmpty() == false && secondStack.isEmpty() == false) {
int dig1 = leadingStack.pop();
int dig2 = secondStack.pop();
if (borrow = true) {
dig1 -= 1;
borrow = false;
}
if (dig1 - dig2 < 0) {
dig1 += 10;
resultStack.push(dig1 - dig2);
borrow = true;
}
}
return resultStack;
}
这有一个非常相似的问题。例如,如果我减去 50 和 45,我得到 4。如果我减去 50,000 和 45,000,我得到 4,900。
我确定我在这里遗漏了一些简单的东西,但我一遍又一遍地查看代码,我不确定它是什么。
【问题讨论】:
-
一次只关注一个部分。使用调试器单步调试代码并查看每一步的变量值。调试是一项重要的技能,只能通过实践来学习。
-
密切关注您的 add() 方法如何处理不同位数的数字。
-
你在使用
java.util.Stack时不是在“使用库”吗? -
没有必要使用 == 来比较布尔值,因为结果是一个你已经开始的布尔值。
x == true与x相同。x == false与!x相同。 -
还要确保您知道 = 和 == 之间的区别。
标签: java stack biginteger addition subtraction