Python

Задача по Python

Напишите программу, которая вводит два целых числа и находит их произведение, не используя операцию умножения. Учтите, что числа могут быть отрицательными.

Входные данные
Входная строка содержит два целых числа.

Выходные данные
Программа должна вывести произведение введённых чисел.

Примеры
входные данные
6 12
выходные данные
72
входные данные
-7 15
выходные данные
-105
Через сложения с делением одного из слагаемых пополам.
 def mul(a, b):
sb = -(b < 0)
p, a, b = 0, (a ^ sb) - sb, (b ^ sb) - sb
while b:
if b & 1: p += a
a, b = a + a, b >> 1
return p

print(mul(*map(int, input().split())))

Нормализуем знаки, чтобы "b" всегда было > 0 (т.е. если минус есть, то он должен быть в "a").
Дальше в цикле удваиваем первое слагаемое и уполовиниваем второе, добавляя первое к произведению тогда, когда младший бит второго равен 1.
Алгоритм требует логарифмического количества сложений.

Для проверки можно вбить, например, такие числа:
 1000000000000000000 1000000000000000000 
И сравнить результат с результатом алгоритма следующего ответчика.

Когда-то читал ещё в советских изданиях, что русские крестьяне, не знавшие таблицы умножения, использовали этот способ. Быстро и надёжно, а из умений требует только складывать и делить на 2 с остатком. И у египтян с эфиопами был похожий метод. А то "Ада Лавлейс", "Чарлз Бэббидж", фу ты ну ты...

Ещё вариант - сложениями составить "таблицу умножения" из цифр, состоящих из некоторого количества бит, например, 4 или 5. И тогда делить второе слагаемое не на 2, а на 2 в степени этого количества бит.
Сложность останется логарифмической, но с более высоким основанием, т.е. алгоритм будет быстрее в константное число раз.
Такой подход оправдан для сложения чисел из нескольких десятков десятичных цифр и более.
Elnur Haciyev
Elnur Haciyev
54 053
Лучший ответ
 print('введите два числа через пробел')  

a, b = map(int, input().split())

result = 0



# Учет отрицательного результата

if (a < 0 and b > 0) or (a > 0 and b < 0):

negative_result = True

else:

negative_result = False



# Приведение чисел к положительной форме

a = abs(a)

b = abs(b)



# Вычисление произведения

for _ in range(b):

result += a



# Учет отрицательного результата

if negative_result:

result = -result



print(result)
Elnur Haciyev Минут 5 назад ввёл
 1000000000 1000000000 
до сих пор считает...
Elnur Haciyev О, досчитал.
Пробуем теперь
 1000000000000 1000000000000