Напишите программу, которая вводит два целых числа и находит их произведение, не используя операцию умножения. Учтите, что числа могут быть отрицательными.
Входные данные
Входная строка содержит два целых числа.
Выходные данные
Программа должна вывести произведение введённых чисел.
Примеры
входные данные
6 12
выходные данные
72
входные данные
-7 15
выходные данные
-105
Python
Задача по Python
Через сложения с делением одного из слагаемых пополам.
Нормализуем знаки, чтобы "b" всегда было > 0 (т.е. если минус есть, то он должен быть в "a").
Дальше в цикле удваиваем первое слагаемое и уполовиниваем второе, добавляя первое к произведению тогда, когда младший бит второго равен 1.
Алгоритм требует логарифмического количества сложений.
Для проверки можно вбить, например, такие числа:
Когда-то читал ещё в советских изданиях, что русские крестьяне, не знавшие таблицы умножения, использовали этот способ. Быстро и надёжно, а из умений требует только складывать и делить на 2 с остатком. И у египтян с эфиопами был похожий метод. А то "Ада Лавлейс", "Чарлз Бэббидж", фу ты ну ты...
Ещё вариант - сложениями составить "таблицу умножения" из цифр, состоящих из некоторого количества бит, например, 4 или 5. И тогда делить второе слагаемое не на 2, а на 2 в степени этого количества бит.
Сложность останется логарифмической, но с более высоким основанием, т.е. алгоритм будет быстрее в константное число раз.
Такой подход оправдан для сложения чисел из нескольких десятков десятичных цифр и более.
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 в степени этого количества бит.
Сложность останется логарифмической, но с более высоким основанием, т.е. алгоритм будет быстрее в константное число раз.
Такой подход оправдан для сложения чисел из нескольких десятков десятичных цифр и более.
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)
Похожие вопросы
- Решение задач по python
- Нужно решить задачу на Python
- Помогите решить задачу на Python. Никак не могу решить задачу, больше дня не могу найти ответ! Никакой код не работает.
- Python# Можно помощь с задачей на Python
- Еще одна задача в Python
- Пожалуйста, помогите решить задачу на Python. Упражнения 57,58,59,60.
- Интересная задача на PYTHON?
- Задача на Python
- Пожалуйста, помогите решить задачу на Python. Упражнение 124, 125, 146
- Помогите пожалуйста с задачей на Python.
Пробуем теперь