Умножение очень длинных целых чисел

Альтернативный трюк для функционально-подобных макросов состоит в том, чтобы поместить в декларатор избыточные скобки в определении:

int (function)(int i) {
    ...
}

Это предотвращает сопоставление и расширение функционально-подобного макроса, но не влияет на определение.

7
задан Valdemarick 11 April 2009 в 20:50
поделиться

5 ответов

Большинство языков имеет функции или библиотеки, которые делают это, обычно названное библиотекой Bignum (GMP является хорошим.)

Если бы Вы хотите сделать это сами, я сделал бы это тот же способ, которым люди делают долгое умножение на бумаге. Чтобы сделать это, Вы могли или работать со строками, содержащими число, или сделать это в двоичных битовых операциях использования.

Пример:

  45
 x67
 ---
 315
+270
----
 585

Или в двоичном файле:

   101
  x101
  ----
   101
  000
+101
------
 11001

Править: После выполнения его в двоичном файле я понял, что будет намного более просто (и быстрее конечно) кодировать битовые операции использования вместо строк, содержащих основу 10 чисел. Я отредактировал свой двоичный умножающийся пример для показа шаблона: для каждого 1-разрядного в нижнем числе, добавьте, что главное число, смещенное на бит, оставило должность 1-разрядных времен к переменной. В конце та переменная будет содержать продукт.

Для хранения продукта Вы должны будете иметь два 64-разрядных числа и вообразить одного из них являющийся первыми 64 битами и другого вторые 64 бита продукта. Необходимо будет написать код, который несет дополнение от бита 63 из второго числа к биту 0 из первого числа.

13
ответ дан 6 December 2019 в 07:53
поделиться

Если Вы не можете пользоваться существующей библиотекой сверхбольшого числа как GMP, проверьте статью Википедии об умножении в двоичной системе с компьютерами. Существует много хороших, эффективных алгоритмов для этого.

4
ответ дан 6 December 2019 в 07:53
поделиться

Самый простой путь состоял бы в том, чтобы использовать механизм учебника, разделяя Ваши произвольно размерные числа на блоки 32-разрядных каждый.

Учитывая B C D * E F G H (каждый 32-разрядный блок, для общих 128 битов)
Вам нужен выходной массив 9 dwords широкий. Изложенный [0.. 8] к 0

Вы запустили бы путем выполнения: H * D + [8] => результат на 64 бита.
Сохраните низкие 32 бита в [8] и возьмите высокие 32 бита, как несут
Далее: (H * C), + [7] + несут
Снова, хранилище, низко 32-разрядное в [7], используйте высокие 32 бита, как несут
после выполнения H*A + [4] + несут, необходимо продолжить цикличное выполнение, пока у Вас нет никаких, несут.

Затем повторитесь с G, F, E.
Для G Вы запустили бы в [7] вместо [8] и т.д.

Наконец, обход через и преобразовывает большое целое число в цифры (который потребует, "делят большое количество на отдельное слово" стандартная программа),

3
ответ дан 6 December 2019 в 07:53
поделиться

Это часто дается как присвоение домашней работы. Алгоритм, который Вы изучили в начальной школе, будет работать. Пользуйтесь библиотекой (несколько упоминаются в других сообщениях), если Вам нужно это для реального приложения.

1
ответ дан 6 December 2019 в 07:53
поделиться

Да, Вы делаете это с помощью типа данных, который является эффективно строкой цифр (точно так же, как нормальная 'строка' является строкой символов). Как Вы делаете это является очень языковозависимым. Например, Java использует BigDecimal. Какой язык Вы используете?

1
ответ дан 6 December 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: