天天看點

有限制條件的求1+2+...+n

//求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字
//及條件判斷語句(A?B:C)

//解法1:利用構造函數求解。關鍵是static的應用。
class Temp
{
private:
	static unsigned int n;		//static資料成員獨立于該類的任意對象而存在,每個static資料成員是與類關聯的對象
	static unsigned int sum;	
public:
	Temp(){ ++n; sum += n; }  //可以用加法。。
	static void reset(){ n = 0; sum = 0; }
	static unsigned int getSum(){ return sum; }
};

unsigned int Temp::n = 0;  //在類中不能對static資料成員進行初始化,要初始化的話必須在類外進行定義!
unsigned int Temp::sum = 0;

unsigned int mySum0(unsigned int n) 
{
	Temp::reset();
	Temp * a = new Temp[n];
	delete[] a;
	return Temp::getSum();
}


//解法2:利用虛函數求解
class A
{
public:
	virtual unsigned int sum(unsigned int n){ return 0; }
};

A* Array[2];

class B : public A
{
	virtual unsigned int sum(unsigned int n) //選擇性調用解決了遞歸終止條件的問題
	{
		return Array[!!n]->sum(n - 1) + n;//當n為0時調用A的sum
	}
};
unsigned int mySum1(unsigned int n)
{
	A a;
	B b;
	Array[0] = &a;
	Array[1] = &b;

	unsigned int value = Array[1]->sum(n);
	return value;
}
//解法3:利用函數指針求解,如果環境是純C,不能用虛函數類之類的,用函數指針。
typedef unsigned int (*fun) (unsigned int);

unsigned int mySum2_Terminator(unsigned int n)
{
	return 0;
}
unsigned int mySum2(unsigned int n)
{
	static fun f[2] = { mySum2_Terminator, mySum2 };
	return n + f[!!n](n - 1);
}

//解法4:利用模闆類型求解
template <unsigned int n> struct mySum3
{
	enum Value { N = mySum3<n - 1>::N + n };
};
template <> struct mySum3<1>
{
	enum Value { N = 1 };
};

//mySum<100>::N就是1+2+...+100的結果,缺點:n不能動态輸入,且n值不能太大,即遞歸不能太深

#include "iostream"
using namespace std;
int main()
{
	cout << mySum1(5) << endl;
	return 0;
}
           

這道題真是太棒了。需要對很多概念很深刻的了解,然後還要靈活應用。