这是我对 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/