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

Студворк — интернет-сервис помощи студентам

Усердно грызу (по мере наличия свободного времени) книжку “Песни о Паскале”, хочу все таки научится чему нибудь.
Вот такое задание: Пусть программа запросит два числа N и M, а затем вычислит их произведение без использования операции умножения. Подсказка: организуйте цикл суммирования N раз числа M.
Вообщем долго думал, подсмотрел…..вроде работает…..

Pascal
1
2
3
4
5
6
7
8
9
10
11
var
n,m,a,b:integer;
begin
writeln('Введите число 1');
readln(n);
writeln('Введите число 2');
readln(m);
for a:=1 to n do b:=b+m; 
writeln(b);
readln;
end.

Убейте меня, не понимаю я, причем тут ‘b’, откуда оно взялось? Все понятно до DO, потом не понимаю…..откуда ‘b’?

Natali



Знаток

(380),
на голосовании



7 лет назад

Голосование за лучший ответ

Александр

Гуру

(2853)


7 лет назад

алг ПРОИЗВ
цел А, В, С, Х
нач
ввод А
ввод В
С: =1
Х: =0
пока С<=В повторять
нц
Х: =Х+А
С: =С+1
кц
кон

Денис Молдавский

Знаток

(401)


7 лет назад

program Your_HomeWork;

var a, b, c: integer;

begin
readln(a, b);
for var i := 1 to b do
c += a;
writeln(c);
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                   ; иначе - выходим

Смотрите также

  • © 2014 — 2023 «Game 🏃 Runs» — прохождения видеоигр
  • Отказ от ответственности
  • Правообладателям
  • Постеры игр: © MobyGames.com
  • Полезное

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

кон

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

Гость

Гость ?

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

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

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

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

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

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

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

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

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

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

Добавить комментарий