【发布时间】:2019-05-19 11:56:48
【问题描述】:
当我准备考试时,我发现了一个问题,要求提供一种间接乘法算法。
问题:
p和q两个整数可以通过下面的方法间接相乘。
如果预期乘积为 r(最初为 0),则如果 q 为奇数,则将 p 添加到 r 并且 q 减 1,如果 q 为偶数,则 p 加倍并且 q 减半(即 q 变为 q/2) 如果 q 是偶数 p 加倍并添加到 r 并且 q 减半(即 q 变成 q/2)
进一步指出,间接乘法用于直接乘法昂贵的数字计算机中
经过几个小时的尝试,我设法找到了一种迭代和递归算法,但它们并不完美。
迭代
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 就会失败。
我正在上网,但找不到匹配项。 有人可以解释一下上述算法有什么问题吗,或者是否有错误,或者是否有更好的方法来解决这些问题。
【问题讨论】:
-
“p is doubled”部分应该被视为对
p的存储值的修改(结果随后添加到r)。相反,您将两次p添加到r而不更新p。 -
您告诉我们您的算法有哪些不完善之处,我们可以帮助您找出原因。 IE。请描述什么是错误的,什么意外发生,什么没有发生,崩溃,挂起,错误的结果,在哪些情况下?
-
qp = (q-1)p + p是有道理的,但第二个条件(q/2)(2p) + 2p = 2p+qp != pq可以为我解释一下吗? -
@Yunnosch 编辑了问题'