您的位置:首页 > 其它

求1+2+3+...+n

2016-03-05 16:28 176 查看

题目描述

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

解答

  通常求1+2+3+…+n,除了用公式(1+n)*n/2之外,无非使用递归和循环两种思路。由于已经明确限制不能使用for和while,所以不能使用循环。递归函数也需要if语句或者条件判断语句来判断递归式继续执行还是终止,所以递归也没办法使用。

利用构造函数求解,使用了static成员

  循环只是让相同的代码重复执行n遍而已,完全可以不用for和while来达到相同的目的。比如我们先定义一个类型,接着创建n个该类的实例,那么这个类型的构造函数将被调用n次。我们可以将累加的相关代码放在构造函数中。

  

class Temp
{
public:
Temp()
{
++N;
Sum+=N;
}

static void reset()
{
N = 0;
Sum = 0;
}

static int getSum()
{
return Sum;
}

private:
static int N;
static int Sum;
};
int Temp::N = 0;
int Temp::Sum = 0;

class Solution {

public:
int Sum_Solution(int n) {
Temp::reset();

Temp *a = new Temp
;

delete a;
a = NULL;

return Temp::getSum();

}
};


利用虚函数求解,也就是多态

  既然不能在一个函数中判断是不是应该终止递归,那么我们不妨定义两个函数,一个充当递归函数的角色,另一个处理终止递归的情况。我们需要做的就是在两个函数中二选一。从二选一我们很自然的想到布尔变量。那么如何将数值n转换成布尔值?如果对n连续做两次反运算,即!!n,那么非零的n转换为true,而0则转换为false

  

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;
}
};

class Solution {

public:
int Sum_Solution(int n) {
A a;
B b;
Array[0] = &a;
Array[1] = &b;

return Array[1]->Sum(n);

}
};


利用函数指针求解

typedef int (*fun)(int);

int Sum_Solution_Terminator(int n)
{
return 0;
}
int Sum_Solution_Fun(int n)
{
fun f[2] = {Sum_Solution_Terminator,Sum_Solution_Fun};
return n+f[!!n](n-1);

}
class Solution {

public:

int Sum_Solution(int n) {

return Sum_Solution_Fun(n);
}
};


这里注意指向成员函数的指针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: