Я добавляю два очень больших целых числа до 125 цифр без использования класса Integer или класса BigInteger, только утилиты Java-утилиты java. Он просто загружает два больших целых числа в стек, а затем сравнивает каждый pop()
.Stack Behavior with Math
я изначально есть метод для загрузки стеки, А и В от их собственных JTextArea.getText()
public Stack<Integer> loadStack(String numA)
{
Scanner scan = new Scanner(numA);
Stack<Integer> stack = new Stack<Integer>();
while (scan.hasNext())
{
stack.push(scan.nextInt());
}
//System.out.println(stack.toString());
return stack;
}
, а затем мой метод, который отображает полученный стек называется resTF.setText(num.addStacks(stackA, stackB).toString());
где resTF еще один JTextArea для результата.
мой метод, который добавляет принимает два Stack<Integer>
«s
public Stack<Integer> addStacks(Stack<Integer> stackA, Stack<Integer> stackB)
{
Stack<Integer> resultStack = new Stack<Integer>();
while(!stackA.empty() && !stackB.empty())
{
try
{
int carry = 0;
//get the digits to add
int tokenA = stackA.pop();
int tokenB = stackB.pop();
//add them and mod 10
int result = tokenA + tokenB + carry;
int resultDigit = result % 10;
//push the result on to the new stack
resultStack.push(resultDigit);
//the updated carry
carry = result/10;
if (carry > 0)
{
resultStack.push(carry);
}
}
catch(ArithmeticException e)
{
e.printStackTrace();
}
}
System.out.println(resultStack.toString());
return resultStack;
}
1: Мой стек дает мне выход, такие как, [6, 66]
при добавлении 555
и 111
, когда желаемый результат будет [6,6,6]
я думаю? Почему это? из-за того, как его читают? Я верю, что, возможно, в дополнение.
2: Когда я печатаю очень очень большие цифры, например 100000000000000000000000000000000000000
и 200000000000000000000000000000000000000
Я получаю, поэтому я знаю его метод loadStacks, который вызывает проблемы, особенно сканирование. Что мне не хватает?
Exception in thread "AWT-EventQueue-0" java.util.InputMismatchException: For input string: "100000000000000000000000000000000000000"
at java.util.Scanner.nextInt(Scanner.java:2123)
at java.util.Scanner.nextInt(Scanner.java:2076)
at GUI.BigNumber.loadStack(BigNumber.java:19)
РЕДАКТИРОВАТЬ 1 *****
public void checkJagged(Stack<Integer> stackA, Stack<Integer> stackB)
{
int stackSizeA = stackA.size();
int stackSizeB = stackB.size();
if (stackA.size() < stackB.size())
{
for (int i = 0; i < stackSizeB; ++i)
{
if (stackA.elementAt(i) == null)
{
stackA.push(0);
}
}
}
if (stackA.size() > stackB.size())
{
for (int i = 0; i < stackSizeA; ++i)
{
if (stackB.elementAt(i) == null)
{
stackB.push(0);
}
}
}
}
Я вижу, я принял все эти вещи во внимание и фиксируется так все отображает правильные цифры и правильный текст :) Только вопрос я есть сейчас, которая на самом деле не вопрос о вине стека является Мне нужно сохранить порядок, похожий на очередь, вместо того, чтобы перевернуть его. [2. 3. 3.1], где мне бы хотелось [1, 3, 3, 2] – SenjuXo
Вы можете использовать целочисленный массив размера (Math.max (stackA.size(), stackB.size()) + 1) в качестве промежуточного хранилища, затем создайте стек из этого (если вам нужно использовать стеки, иначе я бы просто использовал массивы везде). Обратите внимание на то, что цифры sigle storig и использование массивов объектов здесь довольно неэффективны.Вы можете хранить несколько цифр в каждой записи без значительных изменений (в основном, вы должны конвертировать из базы 10 в базовую 1000000 или аналогичную) –
Я отредактировал свой вопрос в отношении того, чтобы оба стека имели одинаковый размер с вводом 0, если они нет, внутри моего редактирования исходного сообщения это реализация чего-то близкого? @Stefan Haustein – SenjuXo