> 技术文档 > 《算法题》求1+2+3+...+n(牛客中等题)

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


文章目录

  • 一、题目链接
  • 二、思路
  • 三、代码全视图

一、题目链接

题目链接(牛客网)

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

二、思路

不使用任何循环语句(for/while等)不使用条件判断语句(if/else/switch/三元运算符等)不使用乘除法

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

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

内存布局:
《算法题》求1+2+3+...+n(牛客中等题)

以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的求和

三、代码全视图

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(); // 返回累加结果 }};