【剑指offer】只用加减求1+2+3+...+n(C++)

题目描述

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

测试用例

输入正整数n,返回1~n的累加和。
测试用例:给定n=5,返回15。

解决方案

求解思路

在没有方法限制的情况下,我们很容易想到下列求解方法
(1)等差数列求和公式
求1~n累加和的公式如下:
求1~n的累加和
可见,需要乘除法的参与。
(2)循环
for/while语句循环执行n次加法,如

int res = 0;
for(int i=1; i<=n; ++i){
	res += i;
}

可见,需要循环语句。
(3)递归
可看作(2)的非循环语句形式

//递归求解1~n的累加和
int Sum_solution(int n){
	//处理非法n的情况
	if(n<1) return 0;
	//条件语句判定递归结束
	if(n==1) return 1;
	return Sum_Solution(n-1);
}

可见,需要条件判断语句。

那么,除了以上三种方式,是不是就没有其他任何办法了呢?
是的,这个题无解,大家可以散了。。。

什么,还不走?好吧,那我就告诉你基于方法(3)的改进版本,即条件语句的替代写法——利用逻辑运算符

Solution:短路求值

我们都知道"&&“和”||“逻辑运算符具有一个非常重要的属性:只要根据左侧的表达式可得到整个表达式的真假,求值过程便告终止,不会执行右侧表达式,这称之为短路求值(short-circuit evaluation)
于是,我们可以使用”&&“和”||"操作符代替条件判断语句,假设语句是 (expr1 && expr2),那么当expr1为假时,整个表达式为假,expr2不会执行;假设语句是 (expr1 || expr2),那么当expr1为真时,整个表达式为真,同样expr2被忽略。

在本题中,需要在递归最后判断n是否减到1,即当n>1时执行右侧递归表达式,n==1时不再执行右侧递归。因此采用 (expr1 && expr2) 形式。上代码:

class Solution {
public:
    //只用加减运算求1~n累加和
    int Sum_Solution(int n) {
        //&&逻辑运算代替条件运算符,学到了学到了
        bool flag = n && (n += Sum_Solution(n-1));
        return n;
    }
};

ps: 其实还有一种方法就是根据(1)的求和公式,进一步写成sum = (n+n2)/2 ,其中用到pow()函数求平方,用位运算>>1求除以2;pow()本质也是乘法,显然不符合题目要求,在此也不进行讨论了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值