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

44 篇文章 0 订阅
43 篇文章 0 订阅

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

这道题真是太棒了。需要对很多概念很深刻的理解,然后还要灵活应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值