求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

 

求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的增长, 再定义一个静态成员变量, 实现相加的功能就可以了
有了思路, 就上代码

OJ链接

递归思路

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;
}

运行结果 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值