多种方法实现加法求和

题目:求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的值返回。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值