Этот вопрос вдохновлен этим ответом . По совпадению я использовал Эфиопское Умножение, когда я был ребенком, но никогда не знал название метода до недавнего времени.
Эфиопское умножение - это метод умножения целых чисел с использованием только сложения, удвоения и деления пополам.
Метод:
- Возьмите два числа, которые нужно умножить, и запишите их в верхней части двух столбцов.
- В левом столбце несколько раз делите пополам последнее число, отбрасывая все остатки, и записывайте результат ниже последнего в том же столбце, пока не напишите значение 1.
- В правом столбце несколько раз удвойте последнее число и напишите результат ниже. остановка, когда вы добавляете результат в той же строке, где в левом столбце отображается 1.
- Изучите созданную таблицу и откажитесь от любой строки, в которой значение в левом столбце является четным. Суммируйте значения в правом столбце, которые остались, чтобы получить результат умножения исходных двух чисел вместе.
Например: 17 х 34
17 34
Половина первого столбца:
17 34
8
4
2
1
Удвоение второго столбца:
17 34
8 68
4 136
2 272
1 544
В зачеркнутых строках, чья первая ячейка четная, мы сделаем это, заключив эти числа справа в квадратные скобки:
17 34
8 [68]
4 [136]
2 [272]
1 544
Суммируйте оставшиеся числа в правом столбце:
17 34
8 [68]
4 [136]
2 [272]
1 544
=====
578
Таким образом, 17, умноженное на 34, по эфиопскому методу равно 578.
Задание:
Гольф-код, который принимает два числа от 1 до 1000 и выполняет ту же схему и алгоритм, отображая продукт ниже.
Метод ввода: однако вы выбираете ...
Пример ввода:
19 427
Результирующий вывод:
19 427
9 854
4 [1708]
2 [3416]
1 6832
======
8113
Пожалуйста, обратите внимание на выравнивание цифр. Это наиболее важно в макете. Также обратите внимание, что двойная линия, обозначенная знаками равенства, должна быть на два символа длиннее общего ответа и должна быть выровнена по центру.
тестирование
Как вы будете это тестировать? Предоставляя прогон вашей программы, используя два числа. Эти числа могут быть извлечены из вашего идентификационного номера пользователя (это можно получить, наведя курсор на свой аватар в верхнем окне). Возьмите ваш номер и возьмите последние три цифры, это будет номер B, возьмите все остальное, что будет впереди, это будет номер A. Затем проверьте на A раз B.
Пример тестирования:
Мой идентификационный номер пользователя 8555, поэтому мои номера 8 и 555. Таким образом, мой вывод должен выглядеть следующим образом:
8 [555]
4 [1110]
2 [2220]
1 4440
======
4440
Ограничения:
Не допускается использование собственных операторов умножения, кроме как при использовании «удвоения», как указано в алгоритме. Другими словами, если вы используете оператор типа *, он может использоваться только для умножения только на 2.
Записи, которые не придерживаются этого, не будут рассматриваться, и пользователя будут сопровождать из помещения с картонной коробкой, полной их вещей. Каждая запись будет иметь код плюс тест, основанный на вашем идентификационном номере.
Это код гольф. Наименьшее количество байтов получит приз, славу и восхищение своих пэров ... (И, может быть, Ламборджини ... Я сказал "возможно"!)
*
илиx
), но невозможно определить, используется ли умножение или нет. За исключением этой части, задача интересная.