码迷,mamicode.com
首页 > 其他好文 > 详细

求n个数的和

时间:2015-05-05 10:44:17      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:递归      

技术分享题目:

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


解法一:

      循环只是让相同的代码执行n遍而已,我们完全可以不用for和while达到这个效果,比如定义一个类,我们new一含有n个这种类型元素的数组,那么该类的构造函数将确定会被调用n次,我们可以将需要执行的代码放到构造函数里。

#include<iostream.h>
class Temp
{
public:
Temp()
{
++N;
Sum += N;
}
static void Reset(){ N = 0; Sum = 0; }
static int GetSum(){ return Sum; }
private:
static int  N;
static int Sum;
};


int Temp::N = 0;
int Temp::Sum = 0;
int solution1_Sum(int n)
{
Temp::Reset(); 
Temp* a = new Temp[n];
delete []a;
a = 0;
return Temp::GetSum();
}


int main()
{
cout << solution1_Sum(100) << endl;
return 0;
}


解法二:

     既然不能判断是不是应该终止递归,我们不妨定义两个函数,一个函数充当递归函数的角色,另一个函数处理递归的情况,我们需要做的就是在两个函数里二选一。从二选一我们很自然的想到布尔变量。比如true/(1)的时候调用第一个函数,false/(0)的时候调用第二个函数,那现在的问题是如何把变量n转换成布尔值。

       如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false.


#include<iostream>
using namespace std;
class A;
A* Array[2];

class A
{
public:
virtual int Sum(int n){ return 0; }
};


class B :public A
{
public:
virtual int Sum(int n){ return Array[!!n]->Sum(n - 1) + n;}
};
int solution2_Sum(int n)
{
A a;
B b;
Array[0] = &a;
Array[1] = &b;
int value = Array[1]->Sum(n);
//利用虚函数的特性,当Array[1]为0时,即 Array[0]=&a,执行A::Sum;
//当Array[1]不为0时,即 Array[1]=&b,执行B::Sum.
return value;
}

int main()
{
cout << solution2_Sum(100) << endl;
return 0;
}





求n个数的和

标签:递归      

原文地址:http://blog.csdn.net/wangfengfan1/article/details/45498103

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!