求1+2+3+...+n,不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

当我们学习了static成员,友元函数,和内部类就可以用c++的两种方法解决这个问题:

1、使用静态成员的特性和友元类(也可以不用友元类)

class Sum
{public:
     Sum()//构造函数实现1+2+3+  n
     {
        
         _ret+=_i;
          _i++;
     }
    static int Getret()//静态成员函数的声明
     {
         return _ret;
     }
    static void Init()//静态成员函数的声明
    {
        _i=1;
       _ret=0;
    }
 private:
    static int _i;//静态成员变量的声明
    static int _ret;
    
};
int Sum::_i=1;
int Sum::_ret=0;//定义初始化静态成员变量。

class Solution {
public:
    int Sum_Solution(int n) {
        Sum::Init();//访问静态成员函数。
        Sum *arr=new Sum[n];//使用new,构造n个对象,则会调用n次构造函数
      
        return Sum::Getret();//访问静态成员函数。
    }
};

使用友元类:

class Sum
{
    friend class Solution;//类Solution是类Sum的友元类,则Solution 可以访问Sum的所有成员
    public:
     Sum()
     {
        
         _ret+=_i;
          _i++;
     }
    static int Getret()
     {
         return _ret;
     }
    /*static void Init()
    {
        _i=1;
       _ret=0;
    }*/
 private:
    static int _i;
    static int _ret;
    
};
int Sum::_i=1;
int Sum::_ret=0;

class Solution {
public:
    int Sum_Solution(int n) {
       // Sum::Init();
      Sum::_ret=0;//访问Sum的静态成员
      Sum::_i=1;
        Sum *arr=new Sum[n];
      
        return Sum::Getret();
    }
};

我们一般尽量不要使用友元类,这样会破坏它的封装性。

2、使用内部类

class Solution
{
    class Sum
    {
    public:
        Sum()
        {
            _ret+=_i;
            _i++;
        }
    };
public :
    int Sum_Solution(int n)
    {
        _i=1;
        _ret=0;
        
        Sum arr[n];//变长数组
        
        return _ret;
        
      
            
    }
private:
   static int _i;
   static int _ret;
     
};
int Solution::_i=1;
int Solution::_ret=0;

Sum是Solution的内部类,Sum是Solution的友元类,则Sum可以访问Solution的私有成员和静态成员。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值