Когда я готовился к экзамену, я нашел вопрос, который требует алгоритм косвенного умножения.
Вопрос:
Два целых числа p и q можно косвенно умножить следующим способом:
Если ожидаемый продукт равен r (изначально 0), тогда, если q нечетное p добавляется к r и q уменьшается на 1, если q четное p удваиваетсяи добавляется к r и q , делится пополам (т.е. q становится q / 2)
Itдалее утверждается, что косвенное умножение используется в цифровых компьютерах, в которых прямое умножение стоит дорого
И, пытаясь часами, мне удалось найти итеративный и рекурсивный алгоритм, но они не идеальны.
Итеративный
int multiply(int p, int q){
int r=0;
while(q!=0){
if(q%2==1){
r += p;
q--;
}
else{
r += 2*p;
q = q/2;
}
}
return r;
}
Рекурсивный
int multiplyRec(int p, int q){
if(q==1)
return p;
if(q%2==1){
return (p + multiplyRec(p, q-1));
}
else{
return (2*p + multiplyRec(p, q/2));
}
}
Например, когда я умножаю 6 на 5, ответ в обоих алгоритмах равен 36, адолжно быть 30. Но если я изменил его таким образом, чтобы получить 30, то умножение на 1. не удастся.
Я работал в Интернете, но не смог найти совпадение.Может кто-нибудь объяснить, что не так с вышеупомянутыми алгоритмами, или если есть ошибка или есть лучший способ сделать это.