Складывайте десятичные цифры справа налево с переносом. Для разных знаков вычитайте меньший модуль из большего и сохраняйте знак большего модуля.
Сложение очень больших целых чисел
Складывайте десятичные цифры справа налево с переносом. Для разных знаков вычитайте меньший модуль из большего и сохраняйте знак большего модуля.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Ввод состоит из двух огромных целых чисел, которые нельзя разместить в стандартных целочисленных типах языка, поэтому они передаются как строки. Требуется написать функцию, реализующую сложение этих двух чисел, представленных строками.
Ответ
Складывайте десятичные цифры справа налево с переносом. Для разных знаков вычитайте меньший модуль из большего и сохраняйте знак большего модуля.
Базовое сложение неотрицательных чисел без преобразования всей строки в int:
def add_magnitudes(a, b):
if not a or not b or any(c not in '0123456789' for c in a + b):
raise ValueError('Ожидались десятичные цифры')
i, j, carry = len(a) - 1, len(b) - 1, 0
result = []
while i >= 0 or j >= 0 or carry:
total = carry
if i >= 0:
total += ord(a[i]) - ord('0')
i -= 1
if j >= 0:
total += ord(b[j]) - ord('0')
j -= 1
carry, digit = divmod(total, 10)
result.append(str(digit))
return ''.join(reversed(result)).lstrip('0') or '0'
Для знаковых строк сначала отделите +/- и ведущие нули. При одинаковых знаках используйте сложение модулей. При разных сравните модули по длине и лексикографически, затем вычтите меньший справа налево с заёмом; знак берётся у большего. Нулевой результат всегда нормализуется в '0'. Время и память — O(max(n, m)).