题目地址:https://leetcode-cn.com/problems/qiu-12n-lcof/
题目描述
求 1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
题目示例
示例 1:
输入: n = 3 输出: 6
示例 2:
输入: n = 9 输出: 45
解题思路
数学思路:看到这道题目,第一思路是直接利用等差数列求和公式返回,即1+2+3+...n = n*(n+1)/2,但题目要求不能用乘法,但是可以考虑使用pow函数和移位运算,即左移一位等同于乘2,右移一位等同于除以2,将 n*(n+1)/2转换为(n + pow(n,2))>>1。
递归思路:考虑使用递归条件解决,但递归终止条件是个问题,在这里,我们使用&&作为短路准则来终止,即&&前面的数为真,则执行&&后面的条件,否则,不执行&&后面的条件。举例来说,A&&B,如果A是false,则不执行B,否则执行B,即A相当于if条件,而B则是执行的函数体。在本题中,如果tmp>0为真,则执行后面sum求和条件,否则,不执行,递归终止,直接返回。
STL思路:使用STL中iota函数以及accumulate函数。其中,iota函数的参数是分别是数组的开头,数组的结尾(也可以是其他位置),每次递增的数的大小,而accumulate函数的前两个参数与iota函数一致,但第三个参数表示从哪个位置开始增加。
程序源码
数学
class Solution { public: int sumNums(int n) { return (n + (int)pow(n, 2)) >> 1; } };
递归
class Solution { public: int sumNums(int n) { int sum = 0; bool tmp = n > 0 && (sum = n +sumNums(n - 1)) > 0; return sum; } };
STL
class Solution { public: int sumNums(int n) { int* arr = new int[n]; iota(arr, arr + n, 1); int sum = accumulate(arr, arr + n, 0); return sum; } };
来源:https://www.cnblogs.com/wzw0625/p/12610508.html