Выполнение арифметических операций над изолированными элементами массива

Я ищу четкое объяснение на свой вопрос (НЕ ищу код), но если немного кода поможет вам объяснить себя, пожалуйста, сделайте это... спасибо :)

Вопрос:

-использование Java -основной класс запрашивает у пользователя 2 целочисленных ввода, затем помещает их в 2 массива массивов целочисленного типа. Каждая цифра разбита и хранится в своем собственном индексе, так что это, так сказать, отдельный «элемент».

Например, с моим кодом прямо сейчас это выглядит примерно так:

"Пожалуйста, введите целое число:"

688

"Пожалуйста, введите другое целое число:"

349


На данный момент внутри я сохранил ввод как 2 массива, которые выглядят так:

СписокСписка1: [6, 8, 8]

СписокСписка2: [3, 4, 9]

Теперь предположим, что я хочу выполнить какое-то дополнение, например, ArrayList1 + ArrayList2.

Я, вероятно, продолжу и создам временный массив «результатов», а затем перенесу этот ответ в arraylist1, когда мои вычисления будут завершены.

Но та часть, с которой у меня возникли проблемы, заключается в том, чтобы придумать систематический и понятный способ сложения массивов вместе. Имейте в виду, что в этом примере используется список массивов, который представляет целое число длины 3, но это может быть что угодно. Я мог бы, например, иметь массив с 50 элементами, такими как [2, 4, 4, 3, 7, 3, 6, 3,............], который мог бы представлять огромное число в триллионы и т.д.


person John Smith    schedule 03.02.2012    source источник
comment
Вы хотите получить результат в одном уже существующем массиве (например, += будет вести себя для int)?   -  person AlexS    schedule 04.02.2012


Ответы (4)


Подумайте о том, как бы вы сделали прибавление в начальной школе. Вы бы начали с выстраивания чисел следующим образом:

    1  3  7
+      4  5
-----------

Затем вы должны добавить две последние цифры, чтобы получить

    1  3  7
+      4  5
-----------
          2

И у вас будет перенос 1. Затем вы добавляете следующие две цифры плюс перенос:

    1  3  7
+      4  5
-----------
       8  2

Теперь у вас есть перенос 0, поэтому вы можете добавить последнюю цифру и недостающую цифру, чтобы получить

    1  3  7
+      4  5
-----------
    1  8  2

Общая схема выглядит так: начиная с последней цифры каждого массива, сложите последние два числа вместе, чтобы получить сумму и перенос. Запишите цифру единиц суммы в результирующий массив, затем распространите перенос на следующий столбец. Затем сложите значения в этом столбце (плюс перенос) вместе и повторите этот процесс для цифр. Как только вы исчерпали все цифры в одном из чисел, продолжайте вычислять сумму, но представьте, что пропущенной цифрой является 0. Как только вы обработаете все цифры, у вас будет ответ, который вы ищете.

Надеюсь это поможет!

person templatetypedef    schedule 03.02.2012

Если вы храните цифры в обратном порядке, вашими массивами будет намного проще манипулировать, потому что их единицы, десятки, сотни и т. д. будут выровнены друг с другом (т. е. они будут располагаться по одному и тому же индексу).

Затем вы можете реализовать сложение так же, как учат в начальной школе: пройтись по массивам цифр один за другим, добавить их, проверить переполнение цифр (>=10) и обратить внимание на флаг переноса (результирующая цифра (a+b) % 10, перенос флаг (a+b)/10). Если флаг переноса не равен нулю, когда вы закончили сложение, и с обеих сторон не осталось дополнительных цифр, добавьте флаг переноса в конец результирующего массива.

Единственная оставшаяся проблема — отображение списков. Вы можете сделать это с помощью простой обратной петли.

P.S. Если вы хотите перепроверить свой расчет триллиона мульчи с помощью чего-то, что, как известно, работает, используйте BigInteger для вычисления ожидаемых результатов и сравнения ваших результатов с их результатами.

person Sergey Kalinichenko    schedule 03.02.2012
comment
@JohnSmith reverse фактически переворачивает список - это намного дороже, чем просто перебирать список в обратном направлении. Это важно, если вы хотите распечатать промежуточные результаты, сохранив при этом данные для продолжения вычислений. - person Sergey Kalinichenko; 04.02.2012
comment
@JohnSmith Вы можете умножать так же, как на бумаге. Во-первых, реализуйте умножение массива на цифру — это вопрос распространения флага переноса, который может достигать восьми, по длине нового массива. Затем вы реализуете сдвиг на одну цифру, что так же просто, как добавление лишнего нуля в конец списка. Наконец, используйте процедуру сложения, которую вы уже написали. - person Sergey Kalinichenko; 04.02.2012

Думайте о массиве как о контейнере для хранения. Он может содержать элементы типа «целое число», но его тип по-прежнему «контейнер для хранения». Вы не можете выполнять математические операции с объектами такого типа — только с их содержимым.

person TrentVB    schedule 03.02.2012

у вас есть

list1
list2

и нужна дополнительная переменная

int carry

тогда

1 do add(0,0) on short list, so that at the end two lists have same length.

2 reversely loop the two list. 
  sum=(carry+(e1+e2))
  set e1 (list1 element) = sum%10, 
  carry = sum/10, 
  till the first element.
3 if carry==1, list1.add(0,1)

now list1 stores the result.

Примечание. Шаг 1 не является обязательным. это можно сделать в цикле, проверив длину короткого списка.

person Kent    schedule 03.02.2012