求1+2+3+...+n_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/7a0da8fc483247ff8800059e12d7caf1?tpId=13&tqId=11200&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking首先拿到这个题可能都会直接想到用循环去相加,但是这题又把循环的方式限制死了,那么我们还有没有更巧妙的方法可以解决这题呢?下面根据C++的一些经典语法来解决这题.
方法一:大致思路:利用构造函数来完成迭代相加的过程
1.首先需要自己重新定义一个Sum的类,自定义好构造函数。并且我们定义的这个类需要注意几点:通过_i这样的static静态变量来完成从1到n的循环,用_ret静态变量的方式来记录和,静态成员变量属于整个类,所以对象生命周期是在整个程序运行期间,在类的成员函数中可以随便访问,静态成员为所有类对象所共享,不属于某个具体的实例,跟全局变量特点类似。静态成员变量必须在类外定义,定义时不添加static关键字。
2.然后需要开辟一个a[n]大小的变长数组,如果编译器不支持变长数组的方式,也可利用new的方式动态开辟
3.这个数组在实例化的时候会调用构造函数,那么我们就可以利用构造函数做文章,也就是在构造函数内部去执行累加的过程,这里就好比把Sum()这个构造函数当成while循环一个道理,此处的Sum()这个函数就好比像是一个while或for循环的关键字一样,而里面的具体执行细节都是一样的。
4.处理好Sum类的细节过后,我们可以采用三种方式去返回和:下面第一种采用的是匿名对象的方式调用GerRet,但是这样的方式需要注意一点就是最后要减掉一个n-1,因为匿名对象多了一次拷贝构造。第二种方法就是取巧只开辟n-1个空间。第三种方式并未采取匿名对象,而是对GetRet这个函数稍作修改,把它直接变为static静态函数即可直接访问。第三种方式又是为什么呢?我们都知道在一个类的外面如果要对类进行访问,应当有两种方式,一种就是类采用public去封装,另一种就是利用static成员函数,静态成员函数的特点是没有this指针,只能访问静态成员变量和成员函数,所以第三种方法只需将GetRet这个函数即可。
- class Sum
- {
- public:
- Sum()
- {
- _ret+=_i;
- ++_i;
- }
- int GetRet()
- {
- return _ret;
- }
- private:
- static int _i;
- static int _ret;
- };
- int Sum::_i=1;
- int Sum::_ret=0;
- class Solution {
- public:
- int Sum_Solution(int n)
- {
- Sum a[n];
- return Sum().GetRet()-(n+1);
- }
- };
- class Sum
- {
- public:
- Sum()
- {
- _ret+=_i;
- ++_i;
- }
- int GetRet()
- {
- return _ret;
- }
- private:
- static int _i;
- static int _ret;
- };
- int Sum::_i=1;
- int Sum::_ret=0;
- class Solution {
- public:
- int Sum_Solution(int n)
- {
- Sum a[n-1];
- return Sum().GetRet();
- }
- };
- class Sum
- {
- public:
- Sum()
- {
- _ret+=_i;
- ++_i;
- }
- static int GetRet()
- {
- return _ret;
- }
- private:
- static int _i;
- static int _ret;
- };
- int Sum::_i=1;
- int Sum::_ret=0;
- class Solution
- {
- public:
- int Sum_Solution(int n)
- {
- Sum a[n];
- return Sum::GetRet();
- }
- };
最后一种方法是采用C++语法提供的内部类,注意:内部类就是外部类的友元类。注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。这样的写法就可以不需要使用到static静态函数,不过不是特别好想到.
- class Solution
- {
- private:
- class Sum
- {
- public:
- Sum()
- {
- _ret+=_i;
- _i++;
- }
- };
- private:
- static int _i;
- static int _ret;
- public:
- int Sum_Solution(int n)
- {
- Sum a[n];//定义一个sum的数组
- return _ret;
- }
- };
- int Solution ::_i=1;//初始化i
- int Solution ::_ret=0;//初始化ret