剑指offer第四十六题:求1+2+3+...+n:要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
1 //============================================================================ 2 // Name : JZ-C-46.cpp 3 // Author : Laughing_Lz 4 // Version : 5 // Copyright : All Right Reserved 6 // Description : 求1+2+3+...+n:要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C) 7 //============================================================================ 8 9 #include <iostream> 10 #include <stdio.h> 11 using namespace std; 12 // ====================方法一:利用构造函数求解==================== 13 class Temp { 14 public: 15 Temp() { 16 ++N; 17 Sum += N; 18 } 19 20 static void Reset() { //注意这里是静态方法 21 N = 0; 22 Sum = 0; 23 } 24 static unsigned int GetSum() { //注意这里是静态方法 25 return Sum; 26 } 27 28 private: 29 static unsigned int N; //注意这里是静态变量 30 static unsigned int Sum; //注意这里是静态变量 31 }; 32 33 unsigned int Temp::N = 0; 34 unsigned int Temp::Sum = 0; 35 36 unsigned int Sum_Solution1(unsigned int n) { 37 Temp::Reset(); 38 39 Temp *a = new Temp[n]; //这里创建的是对象数组 40 delete[] a; 41 a = NULL; 42 43 return Temp::GetSum(); 44 } 45 46 // ====================方法二:利用虚函数求解==================== 47 /** 48 * 一个函数充当递归函数的角色,另一个函数处理终止递归的情况,因此使用布尔变量,若n不为0,!!n为1;若n为0,!!n为0; 49 */ 50 class A; 51 A* Array[2]; 52 53 class A { 54 public: 55 virtual unsigned int Sum(unsigned int n) { 56 return 0; 57 } 58 }; 59 60 class B: public A { 61 public: 62 virtual unsigned int Sum(unsigned int n) { 63 return Array[!!n]->Sum(n - 1) + n; 64 } 65 }; 66 67 int Sum_Solution2(int n) { 68 A a; 69 B b; 70 Array[0] = &a; //递归结束,调用的为父类Sum方法 71 Array[1] = &b; 72 73 int value = Array[1]->Sum(n); 74 75 return value; 76 } 77 78 // ====================方法三:利用函数指针求解==================== 79 typedef unsigned int (*fun)(unsigned int); //函数指针定义 80 81 unsigned int Solution3_Teminator(unsigned int n) { 82 return 0; 83 } 84 85 unsigned int Sum_Solution3(unsigned int n) { 86 static fun f[2] = { Solution3_Teminator, Sum_Solution3 }; 87 return n + f[!!n](n - 1); 88 } 89 90 // ====================方法四:利用模板类型求解==================== 91 template<unsigned int n> struct Sum_Solution4 { 92 enum Value {//enum:枚举类型 93 N = Sum_Solution4<n - 1>::N + n 94 }; 95 }; 96 97 template<> struct Sum_Solution4<1> { 98 enum Value { 99 N = 1 100 }; 101 }; 102 103 template<> struct Sum_Solution4<0> { 104 enum Value { 105 N = 0 106 }; 107 }; 108 109 // ====================测试代码==================== 110 void Test(int n, int expected) { 111 printf("Test for %d begins: ", n); 112 113 if (Sum_Solution1(n) == expected) 114 printf("Solution1 passed. "); 115 else 116 printf("Solution1 failed. "); 117 118 if (Sum_Solution2(n) == expected) 119 printf("Solution2 passed. "); 120 else 121 printf("Solution2 failed. "); 122 123 if (Sum_Solution3(n) == expected) 124 printf("Solution3 passed. "); 125 else 126 printf("Solution3 failed. "); 127 } 128 129 void Test1() { 130 const unsigned int number = 1; 131 int expected = 1; 132 Test(number, expected); 133 if (Sum_Solution4<number>::N == expected) 134 printf("Solution4 passed. "); 135 else 136 printf("Solution4 failed. "); 137 } 138 139 void Test2() { 140 const unsigned int number = 5; 141 int expected = 15; 142 Test(number, expected); 143 if (Sum_Solution4<number>::N == expected) 144 printf("Solution4 passed. "); 145 else 146 printf("Solution4 failed. "); 147 } 148 149 void Test3() { 150 const unsigned int number = 10; 151 int expected = 55; 152 Test(number, expected); 153 if (Sum_Solution4<number>::N == expected) 154 printf("Solution4 passed. "); 155 else 156 printf("Solution4 failed. "); 157 } 158 159 void Test4() { 160 const unsigned int number = 0; 161 int expected = 0; 162 Test(number, expected); 163 if (Sum_Solution4<number>::N == expected) 164 printf("Solution4 passed. "); 165 else 166 printf("Solution4 failed. "); 167 } 168 169 int main(int argc, char** argvb) { 170 Test1(); 171 Test2(); 172 Test3(); 173 Test4(); 174 175 return 0; 176 }