题目
要求不能使用乘除法, for, while, if else, switch, case 等关键字
思路
1. 循环已经命令禁止, 禁用 if, 意味着递归也不能使用. 但即便如此, 我们仍然要围绕循环或递归作文章
2. 利用构造函数求解
#include <iostream>using
namespace std;class
Temp {public: Temp() { ++ N; Sum += N; cout << "constructing "
<< endl; } 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();}int
main() { cout << Sum_Solution1(5) << endl; return
0;} |
3. 利用虚函数求解
#include <iostream>using
namespace std;class
A;A *arr[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
arr[!!n]->Sum(n-1) + n; }};int
Sum_Solution2(int
n) { A a; B b; arr[0] = &a, arr[1] = &b; int
value = arr[1]->Sum(n); return
value;}int
main() { cout << Sum_Solution2(5) << endl; return
0;} |
4. using function point. An alternative to virtual function but much more straightforward
#include <iostream>using
namespace std;typedef unsigned int
(*fun) (unsigned int);unsigned int
terminator(unsigned int
n) { return
0;}unsigned int
solution3(unsigned int
n) { static
fun f[2] = {terminator, solution3}; return
n + f[!!n](n-1);} |
总结
1. !!n 可以将整数转化为 0,1
2. heavy use of static to attach number to class or function
原文:http://www.cnblogs.com/xinsheng/p/3564182.html