求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); } };
这里注意指向成员函数的指针
相关文章推荐
- String类的浅拷贝和深拷贝
- JS引擎工作机制描述(转载)
- Counting Sundays
- 依赖倒置原则
- 【making tools】:捕捉牡丹江医学院的网页数据
- gdkoi2016记
- VB打开project时出现冲突名称提示
- Git使用方法(Windows操作系统下)
- LAMP 和 LNMP 下服务的几种启动方式
- 20160305 一个ISO安装多种版本的Windows 7
- oracle 表,视图,索引,序列,同义词等操作集合
- 类加载机制
- SELECT查询
- 软件需求说明书
- 第01篇 为什么推荐使用String直接赋值
- java,关于POJO,查阅资料
- python 第三方库下载地址
- 深入了解事务处理内部的动作
- 自己所有博客汇总
- 1003. Emergency