这是我对 Russian Peasant Multiplication 的简短实现。如何改进?

限制:仅在 a>0,b>0 时有效

for(p=0;p+=(a&1)*b,a!=1;a>>=1,b<<=1);

最佳答案

可以通过添加空格、适当的缩进和适当的函数体来改进它:

int peasant_mult (int a, int b) {
  for (p = 0;
       p += (a & 1) * b, a != 1;
       a /= 2, b *= 2);
  return p;}

看?现在很清楚 for 声明的三个部分是如何使用的。请记住,程序主要是为人眼编写的。不可读的代码总是糟糕的代码。

现在,为了我个人的娱乐,一个尾递归版本:

(defun 农民-mult (a b &optional (sum 0))
"返回 a 和 b 的乘积,
通过农民倍增实现。”
(如果 (= a 1)
(+ b 总和)
(农民-mult(地板(/a 2))
(* b 2)
(+ sum (* b (logand a 1))))))

关于c - 俄罗斯农民乘法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/260511/

10-15 16:45