求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 }

运行结果:

注:此题考察的是发散思维。

原文地址:https://www.cnblogs.com/ivorfeng/p/3063894.html