码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-04-01 10:56:29      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:public   关键字   als   ase   开始   数列   case   除法   使用   

题目地址: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;
    }
};

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

标签:public   关键字   als   ase   开始   数列   case   除法   使用   

原文地址:https://www.cnblogs.com/wzw0625/p/12610508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!