-
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 示例 1:输入: n = 3 输出: 6 示例 2:输入: n = 9 输出: 45
1.递归
-
class Solution { public: int sumNums(int n) { if(n==1) return 1; return n+sumNums(n-1); } };
但上述方法使用了if,解决方法在于利用逻辑运算符的短路特性。示例如下:
如逻辑运算符&&,当A&&B时,若A表达式为false,则A&&B的值已经确定未false,则A&&B表达式不会再去执行表达式B。同理,对于逻辑运算符||,当A||B 时,如果A表达式返回true,则A||B已经确定为true,则不会去执行表达式B
则上述代码修改如下:
class Solution {
public:
int sumNums(int n) {
n && (n += sumNums(n-1));
return n;
}
};
-
2.利用sizeof
-
class Solution { public: int sumNums(int n) { bool arr[n][n+1]; return sizeof(arr)>>1;//sizeof计算数组大小 } };
3.快速乘
-
借用A和B相乘使用加法和位运算来模拟的情形。模拟的实质是将B二进制展开,如果B的二进制表示下第i位为1,则其对最后的结果的贡献就是A*(1<<i),即A<<i。
-
遍历B的二进制的每一位,将所有的和累加起来就是最后的答案
-
代码如下:
-
class Solution { public: int sumNums(int n) { int A=n,B=n+1; int res=0; for(;B>0;B>>=1) { if(B&1) res+=A; A=A<<1; } return res>>1; } };
将其改写为递归形式
-