您的位置:首页 > 其它

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

2014-03-14 20:48 260 查看
一  利用构造函数求解

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

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
();    //()表示初始化为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};

};

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐