leetcode原题:
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。(1 <= n <= 10000)
这题的第一种思路是用回溯,这里不多讨论。第二种方法可以用俄罗斯农民乘法。
我们知道
1
+
2
+
3....
+
n
=
n
∗
(
n
+
1
)
/
2
1+2+3....+n=n*(n+1)/2
1+2+3....+n=n∗(n+1)/2,但这里我们不能使用乘除法,所以可以用位运算>>1来代替除以2,用俄罗斯农民乘法来解决
n
∗
(
n
+
1
)
n*(n+1)
n∗(n+1)。
俄罗斯农民乘法:
俄罗斯乘法是一种计算两数相乘的算法,下面我们举个例子来描述其算算法过程。这里我们以 15*20为例:
若左边的数字若为奇数(除以2后余数为1),则将右边的数字取出,然后进行累加,可以得到其累加和为20+320=340。
一次数位变化的实例代码如下:
int A,B=?;
int ans = 0;
if (B & 1) //一次数位变化
ans += A;
A <<= 1;
return ans;
}