每天学习一算法系列(12) (求1+2+…+n,不能使用乘除法,for、while、if 、else、switch、case 等关键字以及条件判断语句)
2011-05-06 18:13
941 查看
题目:
求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。
代码如下:
思路二:
我们要换种方式思考,这是突然想到类的构造函数,构造函数执行并且只执行一次,况且题目是N个连续的数相加,那么我们可以这样来解:
先定义一个类,然后我们new 一含有n 个这种类型元素的数组,那么该类的构造函数将确定会被调用n 次。我们可以将需要执行的代码放到构造函数里,这样就解决问题了.
代码如下:
求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 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 次。我们可以将需要执行的代码放到构造函数里,这样就解决问题了.
代码如下:
/*----------------------------- 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/C++学习(一)题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
- 【算法题】题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句
- 【练习】题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句
- 《剑指offer》上的一道原题,求1+2+……+n,要求不能使用乘除法,for、while、if、else、switch、case等关键字以及条件判断语句
- 求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句
- 题目:求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句
- 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
- PHP 不用求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- C语言奇思妙想:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句(A?B:C)
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 求 1+2+...+n, 要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句 (A?B:C)。
- 求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句
- 实现1+2+3...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。