面试题64:求1+2+3+4+...n(C++)

ぐ巨炮叔叔 提交于 2020-04-01 10:28:46

题目地址: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;
    }
};
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!