题目:
求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(a?b:c)。
思路:
1、构造函数
在类中定义静态成员变量N和sum,在构造函数中++N,sum+=N;如此一来,创建n个该类型的实例,就会调用n次构造函数,对应的静态变量也就随着更新。
2、虚函数
使用递归时,既然不能再一个函数中判断是不是终止递归,那么不妨定义两个函数,一个函数充当递归函数,一个负责处理递归的结束条件;
需要解决的问题就是如何在两个函数中二选一,自然是通过bool变量。如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。
3、函数指针
在纯C语言中,不能使用虚函数,此时可以使用函数指针来模拟。
4、模板类型
让编译器帮助完成类似于递归的计算。
代码:
1、构造函数
#include <iostream> using namespace std; class Sum{ public: Sum(){ ++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 Sum::N=0; unsigned int Sum::sum=0; unsigned int Sum_Solution(unsigned int n){ Sum::Reset(); Sum* a=new Sum[n]; delete[] a; a=NULL; return Sum::getSum(); } int main() { cout << Sum_Solution(100) << endl; return 0; }
2、虚函数
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; } }; unsigned int Sum_Solution(unsigned int n){ A a; B b; array[0]=&a; array[1]=&b; int sum=array[1]->Sum(n); return sum; } int main(){ int n=100; cout << Sum_Solution(n) << endl; }
3、函数指针
typedef unsigned int (*fun)(unsigned int); unsigned int Solution_Terminator(unsigned int n){ return 0; } unsigned int Sum_Solution(unsigned int n){ static fun f[2]={Solution_Terminator,Sum_Solution}; return n+f[!!n](n-1); } int main(){ int n=100; cout<< Sum_Solution(n)<< endl; }
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/7a0da8fc483247ff8800059e12d7caf1?rp=2
AC代码:
class Sum{ public: Sum(){ ++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 Sum::N=0; unsigned int Sum::sum=0; class Solution { public: int Sum_Solution(int n) { Sum::reset(); Sum* a=new Sum[n]; delete[] a; a=NULL; return Sum::getSum(); } };