牛客网:JZ64 求1+2+3+...+n (C++实现)

在这里插入图片描述

在这里插入图片描述

题目部分:

在这里插入图片描述

解题思路:

方案一:C++静态成员特性

① 核心思想:通过定义一个求和类、定义两个静态成员变量,作用分别是计算求和结果,和往后迭代+1。如何操作呢?当然是将静态成员变量放在类的构造函数当中就行了,每调用一次类的构造函数,就进行一次这样的操作,最终就能算出来结果。当然大家切记不要忘记静态成员变量要记得在类外进行初始化处理。

在这里插入图片描述

② 如何在不破坏类的封装的前提下,将结果传出去呢?很简单利用静态成员函数的特性。所以还要在类中定义一个静态成员函数将结果传出去。

在这里插入图片描述

③ 接下来用该类定义一个变长数组,然后返回其求和结果即可。(这里的原理在于每进行一次类的初始化编译器都会自动调用它的构造函数)原理一致,但实现具体操作略有区别,共有3种操作玩法。

(1)前两种都是用对象 . 静态成员访问的方式,那么就会出现多调用一次类构造函数的情况,所以要么在数组上面做手脚,要么在返回结果上面做手脚即可。

(2)第3种方式就是用类域访问的方式,这就不会出现多调用一次构造函数的情况了。

在这里插入图片描述

需要清楚的是,牛客网上面的题后台使用的编译器是支持C99以后的变长数组的方式,但是VS下的编译器部分版本是不支持的,不支持的解决方式我上面也提供了。

附1:方案一代码提取

class Sum
{
public:
	Sum() // 类的析构函数
	{
		_ret += _i;
		++_i;
	}

	static int GetRet() // 静态成员函数
	{
		return _ret;
	}

private:
	static int _ret; // 计算求和结果
	static int _i; // 往后迭代+1
};

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

class Solution {
public:
	int Sum_Solution(int n) {

		// 第一种方式
		//Sum a[n]; // Sum * p = new Sum[n]; // (不支持变长数组就用这种方式)
		//return Sum().GetRet() - (n + 1);

		// 第二种方式
		/*Sum a[n - 1];
		return Sum().GetRet();*/

		// 第三种方式
		Sum a[n];
		return Sum::GetRet();
	}
};

在这里插入图片描述

方案二:C++内部类特性

核心思路跟方案一是类似的,只不过方案一是利用静态成员特性来实现,而方案二是利用内部类特性来实现,这里就不重复啰嗦了。

在这里插入图片描述

附2:方案二代码提取

class Solution{
private:
	// Sum是Solution的友元
	class Sum
	{
	public:
		Sum()
		{
			_ret += _i;
			++_i;
		}
	};

private:
	static int _i;
	static int _ret;

public:
	int Sum_Solution(int n){
		Sum a[n];
		return _ret;
	}
};

int Solution::_i = 1;
int Solution::_ret = 0;

测试结果:

方案一:

在这里插入图片描述

方案二:

在这里插入图片描述

不出意外的话都应该是正确的。

在这里插入图片描述

备注:

楼主不才,不喜勿喷,若有错误或需要改进的地方,非常感谢你的指出,我会积极学习采纳。谢谢家人们一直以来的支持和鼓励,我会继续努力再接再励创作出更多优质的文章来回报家人们的。编程爱好的xdm,若有编程学习方面的问题可以私信我一同探讨(我尽力帮),毕竟“众人拾柴火焰高”,大家一起交流学习,共同进步!

在这里插入图片描述

2023年2月27日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曜摆摆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值