2016-02-27 3 views
1

Я добавляю два очень больших целых числа до 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

обработка ввода вызывает часть описанной проблемы - сканер будет считывать целое число в качестве одного значения. Сделайте что-то вроде

for (int i = 0; i < numA.length(); i++) { 
    stack.push(Integer.parseInt(numA.substring(i, i + 1)); 
} 

Другая проблема заключается в том, что вы нажимаете на перенос в петле. Это приведет к 1 2 1 2 1 2 для 666 + 666 с фиксированным синтаксическим анализатором. Его «достаточно, чтобы добавить перенос в петлю и только нажать конечное значение переноса после цикла. Кроме того, перед циклом установите значение 0, поэтому предыдущий перенос фактически добавлен (напротив, будет перезаписан 0).

Кроме того, вам необходимо учитывать случай, когда стеки имеют разные размеры. Самый простой способ - продолжать движение, пока один стек не пуст, и обрабатывать исчерпанный стек как содержащий нули.

+0

Я вижу, я принял все эти вещи во внимание и фиксируется так все отображает правильные цифры и правильный текст :) Только вопрос я есть сейчас, которая на самом деле не вопрос о вине стека является Мне нужно сохранить порядок, похожий на очередь, вместо того, чтобы перевернуть его. [2. 3. 3.1], где мне бы хотелось [1, 3, 3, 2] – SenjuXo

+0

Вы можете использовать целочисленный массив размера (Math.max (stackA.size(), stackB.size()) + 1) в качестве промежуточного хранилища, затем создайте стек из этого (если вам нужно использовать стеки, иначе я бы просто использовал массивы везде). Обратите внимание на то, что цифры sigle storig и использование массивов объектов здесь довольно неэффективны.Вы можете хранить несколько цифр в каждой записи без значительных изменений (в основном, вы должны конвертировать из базы 10 в базовую 1000000 или аналогичную) –

+0

Я отредактировал свой вопрос в отношении того, чтобы оба стека имели одинаковый размер с вводом 0, если они нет, внутри моего редактирования исходного сообщения это реализация чего-то близкого? @Stefan Haustein – SenjuXo

0

Я думаю, что ваша проблема в том, что вы ожидаете, что nextInt() вернет только одну цифру, но возвращает все последовательные цифры.

Вам необходимо использовать содержимое текстового поля как String и работать с персонажами.

public Stack<Integer> loadStack(String numA) 
{ 
    if(numA == null) throw new IllegalArgumentException("..."); 
    char[] chars = numA.toCharArray(); 
    Stack<Integer> stack = new Stack<>(); 
    for (char c : chars) { 
     if (Character.isDigit(c)) 
      stack.push((c - '1') < 9 ? (c - '1' + 1) : 0); 
    } 
    return stack; 
}