题目:求1+2+3+...+n
描述:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
递归思路分析:首先判断当n的值为0时,可以直接返回最后的结果值为0。当n的值大于0时,使用递归算法来计算最终的结果。利用逻辑与关系判别实现递归是否终止。
实例分析:输入:5
输入n的值为5,首先将n的值进行判断分析,设定res为最终结果 | ||||
1 | 2 | 3 | 4 | res = 5 |
|
|
| res = res+4 | 递归法再次执行 |
|
| res = res+3 | 递归法再次执行 |
|
| res = res+2 | 递归法再次执行 |
|
|
res = res+2 | 递归法再次执行 |
|
|
|
具体C++代码如下所示:
class Solution { public: int Sum_Solution(int n) { if(n <= 1) return n; int res = n; res && ( res = res + Sum_Solution(n-1) ); return res; } };
时间复杂度:O(N),空间复杂度:O(N)。
数学公式推导法:数学中的求和公式为Sum =((1+n)n)/2,其中n的值可由输入端直接得到,从而直接计算出和的大小。
实例分析:输入:5
将n = 5直接带入公式计算sum的值:
具体C++代码如下所示:
class Solution { public: int Sum_Solution(int n) { int sum = 0; sum = n*(n + 1)/2; return sum; } };
时间复杂度为O(1),空间复杂度为O(1)。
解法三:
思路分析:因为不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句,所以可以采用数学公式法:等差数列法。
构建一个等差数列,sum = (a1 + an)n/2 => (1 + n)n/2 => (n + n^2)/2
其java代码为:
public class Solution { public int Sum_Solution(int n) { int sum=(int)Math.pow(n, 2)+n;//Math.pow(a,b)表示a^b return sum>>1;//右移一位相当于除以2。 } };