Даны два целых числа, умножьте их без использования оператора умножения или условных циклов.
1. Использование рекурсии
Идея состоит в том, что для заданных двух чисел a а также b , мы можем получить a×b путем добавления целого числа a в яблочко b раз до результата. Этот подход демонстрируется ниже на C++, Java и Python:
C++
using namespace std ;
int mul ( int a , int b )
// базовые случаи
if ( a == 0 || b == 0 ) <
return a + mul ( a , b — 1 ) ;
int multiply ( int a , int b )
int m = mul ( a , abs ( b ) ) ;
return ( b < 0 ) ? — m : m ;
cout << multiply ( 3 , 4 ) << » » << multiply ( — 3 , — 4 ) << » »
<< multiply ( — 3 , 4 ) << » » << multiply ( 3 , — 4 ) ;
результат:
12 12 -12 -12
Java
class Main
public static int mul ( int a , int b )
// базовые случаи
if ( a == 0 || b == 0 ) <
return a + mul ( a , b — 1 ) ;
public static int multiply ( int a , int b )
int m = mul ( a , Math . abs ( b ) ) ;
return ( b < 0 ) ? — m : m ;
public static void main ( String [ ] args )
System . out . print ( multiply ( 3 , 4 ) + » » + multiply ( — 3 , — 4 ) + » »
+ multiply ( — 3 , 4 ) + » » + multiply ( 3 , — 4 ) ) ;
Решение задачи «Сумма двух чисел» по теме «Функция input()»
результат:
12 12 -12 -12
Python
def mul ( a , b ) :
# Базовые варианты
if a == 0 or b == 0 :
return a + mul ( a , b — 1 )
def multiply ( a , b ) :
m = mul ( a , abs ( b ) )
return — m if ( b < 0 ) else m
if __name__ == ‘__main__’ :
print ( multiply ( 3 , 4 ) )
print ( multiply ( — 3 , — 4 ) )
print ( multiply ( — 3 , 4 ) )
print ( multiply ( 3 , — 4 ) )
результат:
12
12
-12
-12
2. Итеративное решение с использованием побитовых операторов
Если циклы разрешены, мы можем использовать следующее соотношение:
multiply(a, b) = | multiply(a*2, b/2) if b is even
| b + multiply(a*2, b/2) if b is odd
Реализацию можно увидеть ниже на C++, Java и Python:
C++
using namespace std ;
int multiply ( int a , int b )
// флаг для сохранения, если результат положительный или отрицательный
bool isNegative = false ;
// если оба числа отрицательные, делаем оба числа
// положительно, так как результат все равно будет положительным
if ( a < 0 b < 0 ) <
a = — a , b = — b ;
// если только `a` отрицательное, делаем его положительным
// и помечаем результат как отрицательный
a = — a , isNegative = true ;
// если только `b` отрицательное, делаем его положительным
// и помечаем результат как отрицательный
b = — b , isNegative = true ;
// инициализируем результат
int result = 0 ;
// работать до тех пор, пока `b` не станет 0
// если `b` нечетное, добавить `b` к результату
// умножить `a` на 2
// делим `b` на 2
return ( isNegative ) ? — result : result ;
cout << multiply ( 3 , 4 ) << » » << multiply ( — 3 , — 4 ) << » »
<< multiply ( — 3 , 4 ) << » » << multiply ( 3 , — 4 ) ;
Урок 1. Первая программа на Pascal (Сложение чисел)
результат:
12 12 -12 -12
Java
class Main
public static int multiply ( int a , int b )
// флаг для сохранения, если результат положительный или отрицательный
boolean isNegative = false ;
// если оба числа отрицательные, делаем оба числа
// положительно, так как результат все равно будет положительным
if ( a < 0 b < 0 )
// если только `a` отрицательное, делаем его положительным
// и помечаем результат как отрицательный
isNegative = true ;
// если только `b` отрицательное, делаем его положительным
// и помечаем результат как отрицательный
isNegative = true ;
// инициализируем результат 0
int result = 0 ;
// работать до тех пор, пока `b` не станет 0
while ( b != 0 )
// если `b` нечетное, добавить `b` к результату
if ( ( b
a = a << 1 ; // умножить `a` на 2
b = b >> 1 ; // делим `b` на 2
return ( isNegative ) ? — result : result ;
public static void main ( String [ ] args )
System . out . print ( multiply ( 3 , 4 ) + » » + multiply ( — 3 , — 4 ) + » »
+ multiply ( — 3 , 4 ) + » » + multiply ( 3 , — 4 ) ) ;
результат:
12 12 -12 -12
Python
def multiply ( a , b ) :
# Флаг # для сохранения положительного или отрицательного результата.
isNegative = False
#, если оба числа отрицательные, сделать оба числа
# положительный, так как результат все равно будет положительным
if a < 0 and b < 0 :
#, если только `a` отрицательное, сделайте его положительным
# и отметить результат как отрицательный
isNegative = True
#, если только `b` отрицательное, сделайте его положительным
# и отметить результат как отрицательный
isNegative = True
# инициализирует результат 0
# работает до тех пор, пока `b` не станет 0
#, если `b` нечетное, добавить `b` к результату
a = a << 1 # умножить `a` на 2
b = b >> 1 # разделить `b` на 2
return — result if isNegative else result
if __name__ == ‘__main__’ :
print ( multiply ( 3 , 4 ) ) # 12
print ( multiply ( — 3 , — 4 ) ) # 12
print ( multiply ( — 3 , 4 ) ) # -12
print ( multiply ( 3 , — 4 ) ) # -12
Рекурсивная версия приведенного выше решения оставлена читателям в качестве упражнения.
Оценить этот пост
Средний рейтинг 4.78 /5. Подсчет голосов: 64
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Рубрики Головоломки по программированию Метки Простой, Рекурсивный
Подписывайся
2 Комментарии
Большинство голосов
Новейшие Самый старый
Встроенные отзывы
Просмотреть все комментарии
Просмотр комментариев
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации
- Все проблемы
- Практика DSA
- 100 самых популярных задач
- 50 лучших классических задач
- Лучшие алгоритмы
- Компилятор С/С++
- Компилятор Java
- Компилятор Python
- Компилятор JavaScript
- компилятор PHP
- Компилятор C#
- Свяжитесь с нами
- Политика конфиденциальности
- условия обслуживания
- Подпишитесь на новые публикации
Источник: www.techiedelight.com
Программа которая выводит пример на умножение двух чисел
Оцени ответ
Не нашёл ответ?
Если тебя не устраивает ответ или его нет, то попробуй воспользоваться поиском на сайте и найти похожие ответы по предмету Информатика.
Самые новые вопросы
Гадать еще раз
- Алгебра
- Математика
- Русский язык
- Українська мова
- Информатика
- Геометрия
- Химия
- Физика
- Экономика
- Право
- Английский язык
- География
- Биология
- Другие предметы
- Обществознание
- История
- Литература
- Українська література
- Беларуская мова
- Қазақ тiлi
Показать ещё
Источник: nebotan.com
Деление и умножение в Assembler
Здравствуйте, уважаемые друзья! Продолжаем изучать нашу рубрику, на очереди тема умножения и деления в Assembler. Разберемся со всеми тонкостями этих операций, конечно же, на практическом примере.
Основные команды
- Для умножения в Assembler используют команду mul
- Для деления в Assembler используют команду div
Правила умножения в Assembler
Итак, как мы уже сказали, при умножении и делении в Assembler есть некоторые тонкости, о которых дальше и пойдет речь. Тонкости эти состоят в том, что от того, какой размерности регистр мы делим или умножаем многое зависит. Вот примеры:
- Если аргументом команды mul является 1-байтовый регистр (например mul bl ), то значение этого регистра bl умножится на значение регистра al, а результат запишется в регистр ax, и так будет всегда, независимо от того, какой 1-байтовый регистр мы возьмем.
bl*al = ax - Если аргументом является регистр из 2 байт(например mul bx ), то значение в регистре bx умножится на значение, хранящееся в регистре ax, а результат умножения запишется в регистр eax.
bx*ax = eax - Если аргументом является регистр из 4 байт(например mul ebx ), то значение в регистре ebx умножится на значение, хранящееся в регистре eax, а результат умножения запишется в 2 регистра: edx и eax.
ebx*eax = edx:eax
Правила деления в Assembler
Почти аналогично реализуется и деление, вот примеры:
- Если аргументом команды div является 1-байтовый регистр (например div bl ), то значение регистра ax поделится на значение регистра bl, результат от деления запишется в регистр al, а остаток запишется в регистр ah.
ax/bl = al, ah - Если аргументом является регистр из 2 байт(например div bx ), то процессор поделит число, старшие биты которого хранит регистр dx, а младшие ax на значение, хранящееся в регистре bx. Результат от деления запишется в регистр ax, а остаток запишется в регистр dx.
(dx,ax)/bx = ax, dx - Если же аргументом является регистр из 4 байт(например div ebx ), то процессор аналогично предыдущему варианту поделит число, старшие биты которого хранит регистр edx, а младшие eax на значение, хранящееся в регистре ebx. Результат от деления запишется в регистр eax, а остаток запишется в регистр edx.
(edx,eax)/ebx = eax, edx
Программа
Далее перейдем к примеру: он не должен вызвать у вас каких либо затруднений, если вы читали наши предыдущие статьи, особенно важна статья про вывод на экран, советую вам с ней ознакомиться. Ну а мы начнем:
.386 .model flat,stdcall option casemap:none include ..INCLUDEkernel32.inc include ..INCLUDEuser32.
inc includelib ..LIBkernel32.lib includelib ..LIBuser32.lib BSIZE equ 15 .data ifmt db «%d», 0 ;строка формата stdout dd ? cWritten dd ? CRLF WORD ? .data? buf db BSIZE dup(?) ;буфер
Стандартное начало, в котором мы подключаем нужные нам библиотеки и объявляем переменные для вывода чисел на экран. Единственное о чем нужно сказать: новый для нас раздел .data? Знак вопроса говорит о том, что память будет выделяться на этапе компилирования и не будет выделяться в самом исполняемом файле с расширением .exe (представьте если бы буфер был большего размера) . Такое объявление — грамотное с точки зрения программирования.
.code start: invoke GetStdHandle, -11 mov stdout,eax mov CRLF, 0d0ah ;————————-деление mov eax, 99 mov edx, 0 mov ebx, 3 div ebx invoke wsprintf, ADDR buf, ADDR ifmt, eax invoke WriteConsoleA, stdout, ADDR buf, BSIZE, ADDR cWritten, 0 invoke WriteConsoleA, stdout, ADDR CRLF, 2, ADDR cWritten,0
В разделе кода, уже по традиции, считываем дескриптор экрана для вывода и задаем значения для перевода каретки. Затем помещаем в регистры соответствующие значения и выполняем деление регистра ebx, как оно реализуется описано чуть выше. Думаю, тут понятно, что мы просто делим число 99 на 3, что получилось в итоге выводим на экран консоли.
;————————-умножение mov bx, 4 mov ax, 3 mul bx invoke wsprintf, ADDR buf, ADDR ifmt, eax invoke WriteConsoleA, stdout, ADDR buf, BSIZE, ADDR cWritten, 0 invoke ExitProcess,0 end start
Думаю, что здесь тоже все понятно и без комментариев. Как производиться умножение в Assembler вы тоже можете прочитать чуть выше, ну и результат выводим на экран.
Просмотр консоли
Этот код я поместил в файл seventh.asm, сам файл поместил в папку BIN (она появляется при установке MASM32). Далее открыл консоль, как и всегда, с помощью команды cd перешел в эту папку и прописал amake.bat seventh . Скомпилировалось, затем запускаю исполняемый файл и в консоли получаются такие числа:
Как видите, мы правильно посчитали эти операции.
На этом сегодня все! Надеюсь вы научились выполнять деление и умножение на Assembler.
Поделиться ссылкой:
Источник: codetown.ru