求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
- 限制:
1 <= n <= 10000
思路:第一种方法:递归,由于不能用条件判断语句,可以用与操作的特性来判断n是否为0,如果n为0,则不执行后面的表达式,直接返回。
第二种方法:用加法和位运算模拟乘法。对于A * B,如果B的二进制下表示第i位为1,则这一位对最后结果的贡献就是A*(1<<i),即A<<i。遍历B二进制下的每一位,将所有贡献累加,就是A * B的和。
int sumNums(int n) {
//利用c++ 逻辑运算符的短路评估,如果n == 0,后面的表达式不执行;
n && (n = n + sumNums(n - 1));
return n;
}
//快速乘。题目要求也不能用for循环,B的位数是有限的,可以用枚举的方式手动展开for循环,这里就不写了
int quickMulti(int A, int B) {
int ans = 0;
while (B) {
if (B & 1) {
ans += A;
}
A <<= 1;
B >>= 1;
}
return ans;
}