面试题64. 求1+2+…+n
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
思路
能使用的只有移位、逻辑运算符、赋值和加减法。可以使用&&的短路性质,改写递归出口。
代码
class Solution {
public:
int sumNums(int n) {
n && (n += sumNums(n - 1));
return n;
}
};
俄罗斯乘法
A × B中,将B按照二进制展开,对应第i位为1说明对最终ans的影响是ans += (A << i),由于不能使用循环,n的范围是1到10000,需要展开14次。
代码
class Solution {
public:
int sumNums(int n) {
int ans = 0, A = n, B = n + 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
(B & 1) && (ans += A);
B >>= 1;
A <<= 1;
return ans >> 1;
}
};