求1+2+……+n
题目:求1+2+……+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(A?B:C)
思路:已知1+2+……+n = n(n+1)/2,但是题目条件限制,故公式不能用。求和无外乎循环和递归,但是一般的循环需要用for或while,递归需要用判断语句if,因此要改变思路去思考。
基于循环的做法:利用构造函数。设置类中的静态变量N 和sum,每次实例化对象调用构造函数时把N自增并加到sum上。求1~n的和就是要实例化n个对象。
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 unsigned int Sum_solution1(unsigned int n) 26 { 27 Temp::Reset(); 28 Temp *p = new Temp[n]; 29 delete p; 30 p = NULL; 31 return Temp::GetSum(); 32 }
运行结果:
基于递归的做法:
可以利用虚函数,其中一个执行递归函数的功能,另一个处理递归终止条件的判断。但是问题又来了,如何把一个数n转化为bool型呢?可以利用!!n绕过if判断得到bool类型(0 or 1)。
1 class A; 2 A *Array[2]; 3 class A 4 { 5 public: 6 virtual unsigned int sum(unsigned int n) 7 { 8 return 0; 9 } 10 }; 11 class B:public A 12 { 13 public: 14 unsigned int sum(unsigned int n) 15 { 16 return Array[!!n]->sum(n - 1) + n; 17 } 18 }; 19 20 unsigned int Sum_solution2(unsigned int n) 21 { 22 A a; 23 B b; 24 Array[0] = &a; 25 Array[1] = &b; 26 27 return Array[1]->sum(n); 28 }
运行结果:
注:此题考察的是发散思维。
不经历风雨,怎么见彩虹!