题目:
求1+2+..+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句(A?B:C)。
通常的求法:循环与递归,但是这里已经限制了使用循环(for,while)和递归(if)。
可以考虑使用别的方法来间接实现循环与递归。
解法一:构造函数——实现循环
循环就是让相同的代码执行n遍,这里可以先定义一个类型,接着创建n个该类型的实例,那么这个类型的构造函数将会被调用n次。
class Temp
{
public:
Temp(){++N;SUM+=N;}
static void Reset(){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 Sum_Solution(unsigned int n)
{
Temp::Reset();
Temp *a=new Temp[n];
delete[]a;
a=NULL;
return Temp::GetSum();
}
解法二:虚函数——实现递归
既然不能在一个函数中判断是否应该终止递归,那么不妨定义两个函数,一个函数充当递归函数的角色,另一个函数处理终止递归的情况,需要做的就是在这两个函数中二选一。
如何实现二选一?布尔变量。比如,当true调用第一个函数,当false调用第二个函数。
如何将变量n转换成布尔值?两次取反即可!!即 !!n。
//当n!=0,调用B::Sum;当n==0,调用A::Sum.
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)
{
return Array[!!n]->Sum(n-1)+n;
}
};
int Sum_Solution2(int n)
{
A a;
B b;
Array[0]=&a;
Array[1]=&b;
int value=Array[1]->Sum(n);
return value;
}