剑指 offer set 25 求 1+2+...+n
题目
要求不能使用乘除法, 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

浙公网安备 33010602011771号