1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
''' К задаче 1 на странице 141.''' ''' Блок ввода p1 и p2 ''' p1 = int(input('Какое число нужно умножит? ----> ')) p2 = int(input('На какое числ нужно умножить? -> ')) ''' Блок присвоений ''' i = 0 x = 0 ''' Основной код программы ''' ''' Рассмотрим случай, когда p1 и p2 - положительные числа ''' if p1 >= 0 and p2 >= 0: while i < p2: x = x + p1 i = i + 1 print('Операция № ',i,'.',' Итог: ', x, '.', sep = '') ''' Рассмотрим случай, когда p1 и p2 - отрицательные числа ''' if p1 < 0 and p2 < 0: while i < l: x = x + (-p2) i = i + 1 print('Операция № ',i,'.',' Итог: ', x,'.', sep = '') ''' Рассмотрим случай, когда p1 - число отрицательное, p2 - положительное ''' if p1 < 0 and p2 > 0: while i < p2: x = x + (-p1) i = i + 1 print('Операция № ',i,'.',' Итог: ', x,'.', sep = '') ''' Рассмотрим случай, когда p1 - число положительное, p2 - отрицательное ''' if p1 > 0 and p2 < 0: while i < -p2: x = x + (-p1) i= i + 1 print('Операция № ',i,'.',' Итог: ', x,'.', sep = '') ''' Ответ ''' print('Ответ: ', x, '.', sep = '') |
program zz1;
var x, n, i, p:integer; / / задаем переменные целого типа
begin
write (‘ введите заданное n ‘); / / вводим с клавиатуры заданное число n
read (n);
write (‘ введите заданное x ‘); / / вводим с клавиатуры заданное число х
read (x);
p:=0; / / задаем начальное значение для произведения
for i:=1 to n do / / организуем цикл на n повторений
p:=p + x; / / получаем произведение не используя операцию умножения, прибавляя к сумме заданное число х n раз
write (‘ произведение n на х = ‘, p); / / выводим ответ
end.
Узнай цену своей работы
Формулировка задачи:
напишите программу, которая получает два целых числа и находит их произведение, не используя операцию умножения. Учтите, что числа могут быть отрицательными
Код к задаче: «Найти произведение чисел, не используя операцию умножения»
textual
Листинг программы
var a,b,p,i,z:integer; begin writeln('a'); readln(a); writeln('b'); readln(b); z:=b; if b<0 then z:=-b; for i:=1 to z do begin p:=p+a; end; if b<0 then p:=-p; writeln('p=',p); end.
Перемножение чисел без умножения
Время на прочтение
1 мин
Количество просмотров 5.9K
Перемножение чисел без использования инструкций умножения мало кому покажется интересным, но я попробую предложить свою версию:
Нужно сказать, что в корне данной задачи лежит сдвиг числа на индексы установленных бит. Более того, чем меньше установленных бит у нас будет в регистре RBX, тем меньшее количество циклов будет затрачено для вычисления произведения, с этой целью в начале кода идут команды POPCNT и XCHG, т.е. если нужно, программа обменяет значениями регистры RAX — RBX и пойдёт считать по наименьшему сопротивлению.
К примеру для перемножения чисел 65535*65535 уйдёт 16 циклов, а вот для перемножения 65535*65536 — всего один цикл.
Но даже за этот один цикл в этом коде процессор тратит (по приблизительным подсчётам) 72 тика, в то время как инструкция IMUL перемножит за 36 тиков. На 16 циклов уйдёт 516 тиков.
В результате недолгого мозгового штурма получился следующий ниже код, в регистре rsi получаем произведение rax * rbx.
mov rax, 32768 ;
mov rbx, 12345 ;
popcnt rdx, rax ; подсчитаем количество установленных бит
popcnt rcx, rbx ;
cmp rdx, rcx ;
ja @F ;
xchg rax, rbx ; выбор наименьшего множителя
@@: xor rsi, rsi ; обнулим мусор
@@: mov rdx, rax ; сохраним число для сдвигов
bsf rcx, rbx ; находим установленный бит
btc rbx, rcx ; удалим найденный ранее установленный бит
shl rdx, cl ; сдвигаем число на индекс найденого бита
add rsi, rdx ; складываем полученные в результате сдвигов числа
or rbx, rbx ; проверяем есть ли ещё установленные биты
jnz @B ; если есть, поработаем ещё
ret ; иначе - выходим
thincaiokede
Вопрос по информатике:
В КУМИРЕ
Решить задачу: Ввести два целых числа, найти их произведение, не используя операцию умножения. Пример: Введите два числа: 4 15 4*15=60
В КУМИРЕ
Трудности с пониманием предмета? Готовишься к экзаменам, ОГЭ или ЕГЭ?
Воспользуйся формой подбора репетитора и занимайся онлайн. Пробный урок — бесплатно!
Ответы и объяснения 2
kidai919
Алг Произведение
нач
цел a, b, s
вывод «Введите два числа», нс
ввод a, b
s := 0
нц b раз
s := s + a
кц
вывод a,»*»,b,»=»,s
кон
xedelestivi758
алг
нач
цел a, b, i, p
p:=0
вывод «Введите число а», нс
ввод a
вывод «Введите число b», нс
ввод b
нц для i от 1 до a
p:=p+b
кц
вывод p
кон
Знаете ответ? Поделитесь им!
Гость ?
Как написать хороший ответ?
Как написать хороший ответ?
Чтобы добавить хороший ответ необходимо:
- Отвечать достоверно на те вопросы, на которые знаете
правильный ответ; - Писать подробно, чтобы ответ был исчерпывающий и не
побуждал на дополнительные вопросы к нему; - Писать без грамматических, орфографических и
пунктуационных ошибок.
Этого делать не стоит:
- Копировать ответы со сторонних ресурсов. Хорошо ценятся
уникальные и личные объяснения; - Отвечать не по сути: «Подумай сам(а)», «Легкотня», «Не
знаю» и так далее; - Использовать мат — это неуважительно по отношению к
пользователям; - Писать в ВЕРХНЕМ РЕГИСТРЕ.
Есть сомнения?
Не нашли подходящего ответа на вопрос или ответ отсутствует?
Воспользуйтесь поиском по сайту, чтобы найти все ответы на похожие
вопросы в разделе Информатика.
Трудности с домашними заданиями? Не стесняйтесь попросить о помощи —
смело задавайте вопросы!
Информатика — наука о методах и процессах сбора, хранения, обработки, передачи, анализа и оценки информации с применением компьютерных технологий, обеспечивающих возможность её использования для принятия решений.