求1+2……+n,不能用循环和乘除和条件判断语句

一  利用构造函数求解

每个实例化都会调用构造函数,同时静态变量使得变量只有一个副本,每次实例化后值的改变影响一直存在。

class Temp

{

public:

         Temp(){++n;sum+=n;}       //++n从1开始

       static void Rest(){n=0;sum=0}

        static unsigned int GetSum(){return sum;}

private:

       static unsigned int n;

       static unsigned int sum;

};

unsigned int Temp::n=0;

unsigned int Temp::sum=0;

unsigned int sum1(unsigned int n)

{

    Temp::Rest();          //再次调用时初始化

    Temp *p=new Temp[n]();    //()表示初始化为0

   delete[] p;      //delete[]只是释放指针所指向的内存空间,指针还是指向空间地址

   p=NULL;

   Temp::GetSum();

}

二  利用虚函数求解

如果希望通过基类的指针指向派生类的对象,并且访问某个与基类同名的成员,那么将这个同名函数声明为虚函数,虚函数声明只能在出现类的定义中

class A;
A* Array[2];

class A
{
public:
    virtual unsigned int Sum (unsigned int n)
    {
        return 0;
    }
};

class B: public A
{
public:
    virtual unsigned int Sum (unsigned int n)   //virtual可以不使用,因为系统会根据3方面的检查自动确定为虚函数
    {
        return Array[!!n]->Sum(n-1) + n;     //当n不为0时,为Array[1]指向子类的函数,,n为0时,为Array[0],指向基类的函数
    }
};

int Sum2(int n)
{
    A a;
    B b;
    Array[0] = &a;     //Array[]为指向基类对象的指针
    Array[1] = &b;

    int value = Array[1]->Sum(n);

    return value;
}

三 利用函数指针来求解

 

typedef unsigned int (*fun)(unsigned int);  //定义指针类型的函数fun

unsigned int Solution3_Teminator(unsigned int n)
{
    return 0;
}

unsigned int Sum_Solution3(unsigned int n)
{
    static fun f[2] = {Solution3_Teminator, Sum_Solution3};  //两个函数的指针,
    return n + f[!!n](n - 1);    //为n不为0 ,函数指针指向Sum_Solution3,n为0函数指针指向Solution3_Teminator
}

四 利用模板类型求解

n必须在编译期间就能确定,不能动态输入,递归代码深度有限制,n不能太大

template <unsigned int n> struct Sum_Solution4
{
    enum Value { N = Sum_Solution4<n - 1>::N + n};
};

template <> struct Sum_Solution4<1>
{
    enum Value { N = 1};
};

template <> struct Sum_Solution4<0>
{
    enum Value { N = 0};
};

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值