/********************************************************************* 题目:求1+2+3+....+n,要求不能使用乘除法,for、while、if、else、switch、 case等关键字及条件判断语句(A?B:C)。 *********************************************************************/ /* */ #include<stdio.h> // ====================方法一==================== //利用构造函数 class Temp { public: Temp() { ++ 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 Temp::N = 0; unsigned int Temp::Sum = 0; unsigned int Sum_Solution1(unsigned int n) { Temp::Reset(); Temp *a = new Temp[n]; delete []a; a = NULL; return Temp::GetSum(); } // ====================方法二==================== //利用虚函数 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; } }; int Sum_Solution2(int n) { A a; B b; Array[0] = &a; Array[1] = &b; int value = Array[1]->Sum(n); return value; } // ====================方法三==================== //利用函数指针求解 typedef unsigned int (*fun)(unsigned int); unsigned int Solution3_Teminator(unsigned int n) { return 0; } unsigned int Sum_Solution3(unsigned int n) { static fun f[2] = {Solution3_Teminator, Sum_Solution3}; return n + f[!!n](n - 1); } // ====================测试代码==================== void Test(int n, int expected) { printf("Test for %d begins:\n", n); if(Sum_Solution1(n) == expected) printf("Solution1 passed.\n"); else printf("Solution1 failed.\n"); if(Sum_Solution2(n) == expected) printf("Solution2 passed.\n"); else printf("Solution2 failed.\n"); } void Test1() { const unsigned int number = 1; int expected = 1; Test(number, expected); } void Test2() { const unsigned int number = 5; int expected = 15; Test(number, expected); } void Test3() { const unsigned int number = 10; int expected = 55; Test(number, expected); } void Test4() { const unsigned int number = 0; int expected = 0; Test(number, expected); } int main() { Test1(); Test2(); Test3(); Test4(); return 0; }==参考剑指offer
原文:http://blog.csdn.net/walkerkalr/article/details/21551959