题目:求1+2+3+……+n的和,要求不能使用乘除法、循环、条件判断、选择相关的关键字。
首先来回忆一下
求1+2+3+……+n的和的
最基础的几种解法:
法1:
int
Sum(
int
n
)
{
int
sum = 0;
while
(
n
)
sum +=
n
--;
return
sum;
}
法2:
int
Sum(
int
n
)
{
return
(1 +
n
)*
n
>> 1;
}
法3:
int
Sumof1ToN(
int
n
)
{
if
(0 ==
n
)
return
0;
else
return
n
+ Sumof1ToN(
n
- 1);
}
其实看到方法3,离题目的要求已经很接近了。接下来看一下如何将题目要求都达到
int
Sumof1ToN1(
int
n
)
{
return
(
n
> 0) ? (
n
+ Sumof1ToN1(
n
- 1)) : 0;
}
题目以上的这些方法都非常简单,在这里就不多做解释了。接下来介绍一种稍微不好理解的方法。
该种方法主要利用类的静态成员的特性特性来实现的。
首先来讲解一下类的静态成员都有什么特性呢?
类的静态成员是类的所有对象共用的,意思就是说,无论实例化所少次,类的静态成员都只有一份。
类的静态数据成员必须在类外进行初始化
类的非静态成员函数里可以使用类的静态数据成员,调用类的静态成员函数
需要注意的是类的静态成员函数里边不能使用非静态成员函数和非静态成员变量。
class
Sum
{
public
:
Sum()
//构造函数
{
n++;
_sum += n;
}
static
int
sum()
//类的静态成员函数
{
return
_sum;
}
private
:
static
int
n;
static
int
_sum;
};
//类外初始化类的静态成员函数
int
Sum
::n = 0;
int
Sum
::_sum = 0;
void
Test()
{
Sum
* p =
new
Sum
[5];
cout <<
Sum
::sum() << endl;
delete
[] p;
}
int
main()
{
int
ret = 0;
Test();
//ret = Sum(5);
cout << ret << endl;
return
0;
}
实例化出多少个对象,就会调用多少次构造函数,在构造函数里边跟新n和sum的值,因为n和sum是类的静态成员,所以他们的值每一次更新都会被记录下来的。最后再通过一个静态成员函数将sum的值返回。