1. 题目描述
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
2. 思路一
如果忽视题目的限制条件,这道题就比较简单了,用一个简单的递归就能实现。
class Solution {
public:
int Sum_Solution(int n) {
int sum = n;
if (sum != 0)
{
sum = sum + Sum_Solution(n - 1);
}
return sum;
}
};
递归结束的条件就是n==0。
3. 思路二
如果此时不能用if,那我们可以考虑如何代替if语句,成为递归结束的条件。
此时我们想到了短路求值原理,即:
1. 条件语句 (A||B),如果A为true,此时条件语句一定为true,那么不再对条件B判断;
2. 条件语句(A&&B),如果条件A为false,那么条件语句一定为false,那么不再对条件B判断。
因此我们可以把上述代码写成:
class Solution {
public:
int Sum_Solution(int n) {
int sum = n;
sum && (sum = sum + Sum_Solution(n - 1));
return sum;
}
};
上述代码,利用函数返回值递减直到n=0为止。
4. 思路三
除上述方法外,我们考虑到1+2+3+...+n的求和公式为:n(n+1)/2,我们考虑一下能否利用sizeof函数实现这个公式,其中的除法利用移位运算来实现。代码如下:
class Solution {
public:
int Sum_Solution(int n) {
bool a[n][n+1];
return sizeof(a)>>1;
}
};