题目一:求1+2+3+…+n
题目描述:
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例:
输入:5
返回值:15
分析:
若是只看题目不管要求,这是一道非常简单的题目,我们有好几种方式可以得出最终结果,但加上题目限制条件,可能大多数博友都懵了。
我们来捋一捋:
1、不能使用乘除法,等差数列求和公式不能用了。
2、不能使用for、while,循环求解不能用了。
3、不能使用switch、case和A?B:C,递归求解也不能用了。
思路:
这道题用常规的方式确实解决不了,因为题目把我们要用到的东西都限制死了。解决这道题之前我们需要知道:当一个对象被创建的时候,该对象会自动调用其默认构造函数。
我们需要计算的是1-n这n个数的和,那么我们可以创建n个类对象,这样就可以调用n次构造函数,这就相当于代替了递归。每次需要被加的数都比上一次被加的数大一,我们可以借助于类的静态成员变量,在构造函数中设置该静态成员变量自增即可实现。特别注意,这里必须是静态成员变量,不能是普通的成员变量,因为每个对象被创建时都有属于自己的普通成员变量,而静态成员变量是属于整个类的,这样才能使得这n次调用构造函数时自增的是同一个变量,每个对象访问到的静态成员变量是同一个。同理,存储累加结果的变量也必须是静态成员变量。
代码:
class Add
{
public:
Add() //构造函数
{
_num++;
_ret += _num;
}
static int _num; //静态成员变量,存储正在累加的数字
static int _ret; //静态成员变量,存储1+2+3+...+n的结果
};
//静态成员变量的定义
int Add::_num = 0;
int Add::_ret = 0;
class Solution {
public:
int Sum_Solution(int n) {
//多个测试用例,可能会多次调用,做好初始化工作
//防止第二个测试用例的结果是在第一个测试用例的基础上继续累加得到的
Add::_num = 0;
Add::_ret = 0;
Add* p = new Add[n]; //为n个Add类对象申请空间(可调用n次构造函数)
return Add::_ret; //返回1+2+3+...+n的结果
}
};
代码中为了可以通过类名和类的访问限定符直接突破类域,进而访问到静态成员变量,于是把类的成员变量直接设置为了公有(public)。我们知道,将类的成员变量设置为公有是不安全的,对此,我们可以使用友元类来解决该问题。
代码:
class Add
{
friend class Solution; //声明Solution是Add的有元类
public:
Add() //构造函数
{
_num++;
_ret += _num;
}
private:
static int _num; //静态成员变量,存储正在累加的数字
static int _ret; //静态成员变量,存储1+2+3+...+n的结果
};
//静态成员变量的定义
int Add::_num = 0;
int Add::_ret = 0;
class Solution {
public:
int Sum_Solution(int n) {
//多个测试用例,可能会多次调用,做好初始化工作
//防止第二个测试用例的结果是在第一个测试用例的基础上继续累加得到的
Add::_num = 0;
Add::_ret = 0;
Add* p = new Add[n]; //为n个Add类对象申请空间(可调用n次构造函数)
return Add::_ret; //返回1+2+3+...+n的结果
}
};
代码中我们将Solution声明为Add的友元类,这样Solution类的成员函数就可以访问Add中的非公有成员了。但在某种意义上来说,使用友元是破坏了封装的,使得Solution类的独立性降低了。
实际上,访问类中的静态成员变量最标准的方法是通过静态成员函数,我们可以通过定义静态成员函数来获取静态成员变量,或是对静态成员变量进行修改。
代码:
class Add
{
public:
Add() //构造函数
{
_num++;
_ret += _num

最低0.47元/天 解锁文章
479





