面试题46:求1+2+...+n

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

解法一:利用构造函数求解

 1 class Temp
 2 {
 3     public:
 4         Temp()
 5         {
 6             ++N;
 7             Sum+=N;
 8         }
 9         static void Reset()
10         {
11             N = 0;
12             Sum = 0;
13         }
14         static unsigned int GetSum()
15         {
16             return sum;
17         }
18     private:
19         static unsigned int N;
20         static unsigned int Sum;
21 }
22 unsigned int Temp::N = 0;
23 unsigned int Temp::Sum = 0;
24 
25 unsiged int Sum_Solution1(unsigned int n)
26 {
27     Temp::Reset();
28     Temp* a = new Temp[n];
29     delete [] a;
30     a = NULL;
31     return Temp::GetSum();
32 }

 解法二:利用虚函数求解

可以定义两个函数,一个函数充当递归函数的角色,另一个函数处理终止递归的情况,我们需要做的就是在两个函数里二选一。从二选一我们很自然地想到布尔变量。现在的问题是如何把数值变量n转换成布尔值。如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。

 1 class A;
 2 A* Array[2];
 3 
 4 class A
 5 {
 6     public:
 7         virtual unsigned int Sum(unsigned int n)
 8         {
 9             return 0;
10         }
11 };
12 
13 class B: publice A
14 {
15     public:
16         virtual unsigned int Sum(unsigned int n)
17         {
18             return Array[!!n]->Sum(n-1)+n;
19         }
20 };
21 
22 int Sum_Solution2(int n)
23 {
24     A a;
25     B b;
26     Array[0] = &a;
27     Array[1] = &b;
28     return Array[1]->Sum(n);
29 }

解法三:利用函数指针求解

在纯C语言的编程环境中,我们不能使用虚函数,此时可以用函数指针来模拟。

 1 typedef unsigned int (*fun)(unsigned int);
 2 unsigned int Solution3_Teminator(unsigned int n)
 3 {
 4     return 0;
 5 }
 6 
 7 unsigned int Sum_Solution3(unsigned int n)
 8 {
 9     static fun f[2] = {Solution3_Teminator, Sum_Solution3};
10     return n+f[!!n](n-1);
11 }

解法四:利用模板类型求解

见《剑指Offer》。

posted @ 2015-07-07 16:26  Rosanne  阅读(191)  评论(0编辑  收藏  举报