Как найти произведение чисел не используя умножение

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

thincaiokede

Вопрос по информатике:

В КУМИРЕ
Решить задачу: Ввести два целых числа, найти их произведение, не используя операцию умножения. Пример: Введите два числа: 4 15 4*15=60
В КУМИРЕ

Трудности с пониманием предмета? Готовишься к экзаменам, ОГЭ или ЕГЭ?

Воспользуйся формой подбора репетитора и занимайся онлайн. Пробный урок — бесплатно!

Ответы и объяснения 2

kidai919

kidai919

Алг Произведение
нач
  цел a, b, s
  вывод «Введите два числа», нс
  ввод a, b
  s := 0
  нц b раз
    s := s + a
  кц
  вывод a,»*»,b,»=»,s
кон

xedelestivi758

xedelestivi758

алг

нач

  цел a, b, i, p

  p:=0

  вывод «Введите число а», нс

  ввод a

  вывод «Введите число b», нс

  ввод b

  нц для i от 1 до a

     p:=p+b

  кц

  вывод p

кон

Знаете ответ? Поделитесь им!

Гость

Гость ?

Как написать хороший ответ?

Как написать хороший ответ?

Чтобы добавить хороший ответ необходимо:

  • Отвечать достоверно на те вопросы, на которые знаете
    правильный ответ;
  • Писать подробно, чтобы ответ был исчерпывающий и не
    побуждал на дополнительные вопросы к нему;
  • Писать без грамматических, орфографических и
    пунктуационных ошибок.

Этого делать не стоит:

  • Копировать ответы со сторонних ресурсов. Хорошо ценятся
    уникальные и личные объяснения;
  • Отвечать не по сути: «Подумай сам(а)», «Легкотня», «Не
    знаю» и так далее;
  • Использовать мат — это неуважительно по отношению к
    пользователям;
  • Писать в ВЕРХНЕМ РЕГИСТРЕ.

Есть сомнения?

Не нашли подходящего ответа на вопрос или ответ отсутствует?
Воспользуйтесь поиском по сайту, чтобы найти все ответы на похожие
вопросы в разделе Информатика.

Трудности с домашними заданиями? Не стесняйтесь попросить о помощи —
смело задавайте вопросы!

Информатика — наука о методах и процессах сбора, хранения, обработки, передачи, анализа и оценки информации с применением компьютерных технологий, обеспечивающих возможность её использования для принятия решений.

Понравилась статья? Поделить с друзьями:
  • Как найти частоту вращения электродвигателя
  • Как найти мамонта для скама
  • Как нашли клад в огороде
  • Как найти ординаты конца вектора
  • Windows не удалось обнаружить правильно установленный сетевой адаптер как исправить