问题描述
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
解决
- 利用构造函数求解
创建该类的n个对象,在该类里定义两个静态成员变量n和sum,静态成员变量为所有对象所共享,在构造函数里对其操作。这样创建几个对象就调用几次构造函数,并加了多少次。
class Temp
{
public:
Temp()
{
n++;
sum+=n;
}
void Reset()
{
n=0;
sum=0;
}
int GetSum()
{
return sum;
}
private:
static int n;
static int sum;
}
int Sum_Solution(int n)
{
Temp::Reset();
Temp* a=new Temp[n];
delete [] a;
a=NULL;
return GetSum();
}
2.利用虚函数求解
一个类中函数用于返回,一个类继承该类实现一个递归相加的函数并对基类的sum进行重写。定义两个基类的指针,一个指向基类对象,一个指向子类的对象。
class A;
A* Array[2];
class A
{
public:
virtual int Sum(int n)
{
return 0;
}
};
class B: public A
{
public:
virtual int Sum(int n)
{
return Array[!!n]->Sum(n-1)+n;
}
};
int Sum_Solution(int n) {
A a;
B b;
Array[0]=&a;
Array[1]=(A*)&b;
return Array[1]->Sum(n);
}
3.利用函数指针求解
利用上面的思路定义两个函数,一个是用来求和,一个作为结束条件
typedef int (*fun)(int)
int part1(int n)
{
return 0;
}
int part2(int n)
{
static fun[2]={part1,part2};
return n+fun[!!n](n-1);
]