leetcode面试题64(求1+2+…+n)--C语言实现

丶灬走出姿态 提交于 2020-08-11 04:58:07

求:

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

 

示例 1:

输入: n = 3
输出: 6
示例 2:

输入: n = 9
输出: 45

 

解:

首先想到等差数列求和公式,Sn=n*(n+1)/2,由于题目要求不能做乘除法,可以用>>1代替/2,那么用什么代替乘法?因为Sn=n*(n+1)/2,变形:Sn=(n*n+n)/2,所以可以使用pow(n,2)代替n*n得到结果(结果需要由double转int,涉及浮点运算,复杂化了问题)。

有其他更好的解法吗?

这里想到了循环和递归的等价实现,因为不能用循环,因此考虑递归求解。得到递归式:sumNums(n) = n + sumNum(n-1),这里需要给出递归停止的条件(递归基),很明显,当n为0时递归应该终止。

但是我们不能使用if进行判断怎么办?于是我们想到可以使用逻辑运算符中蕴含的短路运算逻辑,a&&b,如果a为true,计算b,否则不计算。(a||b类似,a为true,不计算b,否则计算)

&&的实现:

int  sumNums( int  n){
     int  sum =  0 ;
    n && (sum += n+sumNums(n- 1 ));
     return  sum;
}

 

||的实现

int  sumNums( int  n){
     int  sum =  0 ;
    n== 0  || (sum += n+sumNums(n- 1 ));
     return  sum;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!