求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
分析:
不能用乘除法, 就只能用加减法, 位运算, 逻辑运算
不能用for、while、if、else、switch、case及条件判断语句, 意味着不能用循环, 不能有判断
1加到n如不用循环的话很明显应该要用递归, 但递归跳出条件也需要判断, 看来循环可以绕开, 判断绕不开, 那么有没有可以代替判断语句的呢?
答案是有滴, && 就可以, && 运算符有一个特点, 当左为假时不会计算右边的值, 当左边为真时才会判断右边的值..还有一种清奇的思路, 利用类的静态成员变量实现O(1)分时间复杂度, 由于类的静态成员有属于类不属于对象的性质, 静态成员变量可以记录这个类实例化了多少对象, 即每次在调用构造函数时, 使这个静态成员变量+1, 这样我们要求1+...+n, 需要实例化出n个对象, 这个静态成员变量就可以实现从1...n的增长, 再定义一个静态成员变量, 实现相加的功能就可以了
有了思路, 就上代码
递归思路
class Solution {
public:
int Sum_Solution(int n) {
int sum = n;
n > 0 && (sum += Sum_Solution(n - 1));
return sum;
}
};
还可以利用静态变量成员, 实现O(1)的复杂度, 上代码
class _Solution {
public:
static int tmp;
static int sum;
_Solution() {
++tmp;
sum += tmp;
}
};
int _Solution::sum = 0;
int _Solution::tmp = 0;
class Solution {
public:
int Sum_Solution(int n) {
_Solution::tmp = 0;
_Solution::sum = 0;
_Solution* p = new _Solution[n];
return _Solution::sum;
}
};
也可以自己实现测试入口
int main() {
Solution p;
cout << p.Sum_Solution(3) << endl;
cout << p.Sum_Solution(6) << endl;
cout << p.Sum_Solution(10) << endl;
system("pause");
return 0;
}
运行结果