每天学习一算法系列(12) (求1+2+…+n,不能使用乘除法,for、while、if 、else、switch、case 等关键字以及条件判断语句)

题目:

 

求1+2+…+n.
要求不能使用乘除法、for、while、if 、else、switch、case 等关键字以及条件判断语句(A?B:C).

 

题目来源于:http://topic.csdn.net/u/20101011/16/2befbfd9-f3e4-41c5-bb31-814e9615832e.html

 

 

思路一:

题目要求不要使用for, while等语句,那对于需要循环来完成的功能我们可以使用Goto来替代,但是最重要的一点是我们如何判断条件结束,不需要借用任何条件语句,~~~~,还有点伤脑筋,再者,用Goto语句来替代for, while语句只不过是投机取巧而已,一般公司的Code Standard都会要求程序员在任何代码中不应使用Goto语句,而且即使用Goto语句也要判断结束条件,然后跳出Goto语句块,问题又还是回到如何判断条件结束的情况,可是根据题目中的限制我们根本没办法判断结束条件,既然不能判断是不是应该终止,我们不妨换个思路,定义两个函数,一个函数充当递归函数的角色,另一个函数处理终止递归的情况,我们需要做的就是在两个函数里二选一,从二选一我们很自然的想到布尔变量,比如ture/(1)的时候调用第一个函数,false/(0)的时候调用第二个函数,那现在的问题是如何把数值变量n转换成布尔值,这是解决问题的关键,解决方案是:对变量n连续做两次逻辑取反运算,即!!n,那么非零的n将变为true,0转变为false。

 

代码如下:

/*-------------------------------- Copyright by yuucyf. 2011.05.06 ---------------------------------*/ typedef int (*PF_Fun) (int nValue); PF_Fun paFun[2]; int GetSum1(int nValue) { return 0; } int GetSum2(int nValue) { return (*paFun[!!nValue])(nValue - 1) + nValue; } int GetValue2(int nValue) { paFun[0] = GetSum1; paFun[1] = GetSum2; int nSum = GetSum2(nValue); return nSum; } int _tmain(int argc, _TCHAR* argv[]) { cout << GetValue2(100) << endl; return 0; }

当然这里也可以使用虚函数的特性来处理这样的问题,具体代码如下:

/*--------------------------- Copyright by july. 2010/10/19 Modified by yuucyf.2011.05.06 ----------------------------*/ class C_Num; C_Num* paNum[2]; class C_Num { public: virtual int GetSum (int nValue) { return 0; } }; class C_NumEx: public C_Num { public: virtual int GetSum(int nValue) { return paNum[!!nValue]->GetSum(nValue-1) + nValue; } }; int GetValue2(int nVal) { C_Num objNum; C_NumEx objNumEx; paNum[0] = &objNum; paNum[1] = &objNumEx; //利用虚函数的特性,当paNum[1]为0时,即paNum[0] = &objNum; 执行C_Num::GetSum, //当Array[1]不为0时, 即paNum[1] = &objNumEx; 执行C_NumEx::GetSum。 int nSum = paNum[1]->GetSum(nVal); return nSum; } int _tmain(int argc, _TCHAR* argv[]) { cout << GetValue2(100) << endl; return 0; }

 

 

思路二:

我们要换种方式思考,这是突然想到类的构造函数,构造函数执行并且只执行一次,况且题目是N个连续的数相加,那么我们可以这样来解:
先定义一个类,然后我们new 一含有n 个这种类型元素的数组,那么该类的构造函数将确定会被调用n 次。我们可以将需要执行的代码放到构造函数里,这样就解决问题了.

 

代码如下:

#include "stdafx.h" #include <iostream> using namespace std; /*--------------------------- Copyright by july. 2010/10/19 Modified by yuucyf.2011.05.06 ----------------------------*/ class C_Number { public: C_Number() { ++ms_nValue; ms_nSum += ms_nValue; } static void Reset() { ms_nValue = 0; ms_nSum = 0; } static int GetSum() { return ms_nSum; } private: static int ms_nValue; static int ms_nSum; }; int C_Number::ms_nValue = 0; int C_Number::ms_nSum = 0; int GetValue(int nVal) { C_Number::Reset(); C_Number *pNum = new C_Number[nVal]; delete [] pNum; pNum = 0; return C_Number::GetSum(); } int _tmain(int argc, _TCHAR* argv[]) { cout << GetValue(100) << endl; return 0; }

思路三:
利用模板元编程实现。

代码如下:

/*----------------------------- Copyright by yuucyf. 2011.05.09 利用模板元编程实现。 -----------------------------*/ template <unsigned N> class C_Num { public: enum { m_Value = N + C_Num<N - 1>::m_Value}; }; template< > class C_Num<1> { public: enum { m_Value = 1}; }; int _tmain(int argc, _TCHAR* argv[]) { cout << C_Num<100>::m_Value << endl; return 0; }

 

 

 

 

你可能感兴趣的:(编程,c,算法,delete,Class,fun)