《算法题》求1+2+3+...+n(牛客中等题)

文章目录

一、题目链接

题目链接(牛客网)

二、思路

复制代码
不使用任何循环语句(for/while等)

不使用条件判断语句(if/else/switch/三元运算符等)

不使用乘除法

为了规避这些限制,我们可以利用
静态成员变量在所有对象间共享

进行编写代码。

首先我们定义并初始化一个类,期间使用static int _i作为计数器,static int _ret 作为储存累加量的整形(同时充当返回值)。这样由于static在静态存储区上,而非普通变量对象所在内存(栈/堆)上。故此它们不会随对象创建销毁。

内存布局:

以n=3为例:

复制代码
初始化静态成员:

    _i = 0

    _ret = 0

创建sum maysheeo[3]数组:

    构造第1个对象:

        _i = 0 + 1 = 1

        _ret = 0 + 1 = 1

    构造第2个对象:

        _i = 1 + 1 = 2

        _ret = 1 + 2 = 3

    构造第3个对象:

        _i = 2 + 1 = 3

        _ret = 3 + 3 = 6

返回sum::ret(),即返回6

其间核心思路在于:

  • 1.利用静态成员保持状态:

    _i:静态成员变量,记录当前要累加的数字(初始化为0)

    _ret:静态成员变量,记录累加的总和(初始化为0)

  • 2.通过对象构造实现隐式循环:

    创建n个sum类对象

    每个对象构造时自动执行构造函数中的累加操作

    n次构造 ⇒ n次累加 ⇒ 实现1到n的求和

三、代码全视图

cpp 复制代码
class sum {
public:
    sum() {
        _i = _i + 1;       // 先递增_i,让i变成1.
        _ret = _ret + _i;  // 然后将递增后的_i加到_ret
    }
    
    static int ret() {
        return _ret;
    }
    
private:
    static int _i;     // 当前数字
    static int _ret;   // 累加结果
};

// 静态成员初始化
int sum::_ret = 0;
int sum::_i = 0;

class Solution {
public:
    int Sum_Solution(int n) {
        sum maysheeo[n];  // 创建n个sum对象的数组。
        //创建sum对象数组时,会调用n次构造函数。
        return sum::ret(); // 返回累加结果
    }
};