zoukankan      html  css  js  c++  java
  • 面试题64:求1+2+3+4+...n(C++)

    题目地址: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;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    Android 六种核心安全机制
    Android 网络通信 HTTP
    Android Thread和AsyncTask
    C#(少用的)
    Asp.net动态生成表单
    设计模式--职责链(学习)
    Extjs表单验证小结
    C#框架
    Javascript获取IFrame内容(兼容IE&FF)
    最近在忙淘宝店的事
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12610508.html
Copyright © 2011-2022 走看看