【剑指offer-C++】JZ64:求1+2+3+...+n

文章讲述了在禁止使用特定编程关键字如乘除法、循环和条件判断语句的情况下,如何用C++实现1到n的求和。通过逻辑运算中的短路运算,将递归解法中的边界条件处理转换为无条件执行的表达式,达到求和目的。这种方法在保证O(n)的时间复杂度和O(1)的空间复杂度下解决问题。
摘要由CSDN通过智能技术生成

【剑指offer-C++】JZ64:求1+2+3+...+n

题目描述

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

数据范围: 0<n≤200。

进阶: 空间复杂度 O(1) ,时间复杂度 O(n)。

输入:5
返回值:15
输入:1
返回值:1

解题思路

求1+2+3+…+n:最直观的想法是,循环或者递归。但是,题目中明确说了,不能使用关键字乘除法、for、while、if、else、switch、case等及条件判断语句(A?B:C),所以我们只能考虑其他方法了。在考虑其他方法时,我们先从原来的解法出发考虑,然后再看看原来的解法中我们可以使用什么方法来替换那些被禁用的方法。下面以原始的递归解法出发。

int Sum_Solution(int n) 
{
    if(n==1)
      return 1;
    return n+Sum_Solution(n-1);
}

idea:我们可以看到,上述递归解法中,只有一个被禁关键字if,那么可以有什么方法来替换该被禁关键字if呢?有!一般这种情况可以考虑逻辑运算或者位运算,此处明显是逻辑运算,其中,逻辑与与逻辑或均是短路运算。我们观察到,递归的边界条件是n==1,也就是说n再小到0就不可以了,那么我们可以使用逻辑与来解决这个问题,即返回n+Sum_Solution(n-1)时其前提条件是n不等于0。

int Sum_Solution(int n) 
{
    n&&(n+=Sum_Solution(n-1));
    return n;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值