求 1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3 输出: 6
示例 2:
输入: n = 9 输出: 45
限制:
1 <= n <= 10000
解法一:递归
本题要求看似过分,实则是考脑子,一种脑筋急转弯。根据(n+1)n/2,我想到了<<位运算,但上面乘法我不知咋解决。看了题解才想到用位运算的短路机制即A&&B时,当A为false时,就不会执行B,还有A||B,当A为true时,就不会执行B。
正常用递归解决累乘的话,代码如下:
class Solution {
public:
int sumNums(int n) {
if(n==0)
return n;
return n+sumNums(n-1)
}
};
需要一个if语句判断递归的出口,那么用上短路机制代替这个if语句:
class Solution {
public:
int sumNums(int n) {
n>0&&(n+=sumNums(n-1));
return n;
}
};
解法二:迭代
重新回到n(n+1)>>1。难以解决的就是n(n+1),如何用位运算和加法来模拟乘法,思路与快速幂相似。对于A*B,我们将B二进制展开,假设B二进制为0110,即A(0+2+4+0),对于2A为A<<1,对于4A为(A<<1)<<1。
class Solution {
public:
int sumNums(int n) {
int ans=0, A=n, B=n+1;
while(B)
{
if(B&1)
ans+=A;
B>>=1;
A<<=1;
}
ans>>=1;
return ans;
}
};
这里的if判断用A&&B短路机制替换,while循环代表B的二进制位数,本题最大范围为10000,所以最多就14位。