剑指 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

 

 

 

posted @ 2014-02-24 10:25  SangS  阅读(224)  评论(0编辑  收藏  举报