您的位置:首页 > Web前端

《剑指offer》:[46]求1+2+3+...+n

2016-06-25 11:38 585 查看
题目:求1+2+3+4+.....+n,要求不能使用除法,for,while,if,else,switch,case等关键字及条件判断语句(A?B:C)。

     看似一些不可能的问题,主要是考察我们的发散思维的能力,发散思维的特点是思维活动的多向性和变通性,也就是我们在思考问题时注重运用多思路、多方案、多途径第解决问题。像1+2+3+...+n的解决方法关键就在找到不用上述关键字如何实现递归和循环!
方案一:公式法。n(1+n)/2。这里不再多说,不是我们想要的结果。
方案二:利用构造函数来求解(基于循环的思路)。循环就是让代码重复的执行N遍而已,所以我们也可以用其他的方法来达到这个效果。这里我们可以先定义一个类型,接着创建n个该类型的实例,那么这个类型的构造函数就会执行n遍,我们可以将与累加相关的代码放在构造函数里。
方案三:利用虚函数来求解(基于递归思路)。由于一个函数可以实现加法,但是还需要一个函数来实现循环和判断终止。所以这里我们定义两个函数,一个函数充当递归函数的角色实现循环,另一个函数处理终止递归的情况,我们需要做的就是在这两个函数里二选一。二选一的时候我们当然会想到bool类型。

   这里有一个技巧,对一个整形的不为0的数n,!n=0(false),两次取反!!n=1(true)。这样的话我们就可以实现循环和终止的条件了。
方案四:利用函数指针来求解。其实这个思路和方案三比较类似。只不过把可以选择调用的虚函数该为了两个函数,调用更加简单直接了而已。
方案五:利用模板类型来求解,完成类似于递归的计算。

方案一:公式法
int Sum(int n)
{
return n*(n+1)/2;
}
方案二:构造函数
#include <iostream>
using namespace  std;
class Sum
{
public:
Sum()
{
n++;
sum+=n;
}
static void Reset()
{
sum=0;
n=0;
}
static int getResult()
{
return sum;
}
private:
static int sum;
static int n;
};
int Sum::sum=0;
int Sum::n=0;
int Sum2(int n)
{
Sum::Reset();
Sum *s=new Sum
;
delete []s;
s=NULL;
return Sum::getResult();
}
int main()
{
int result=Sum2(100);
cout<<"1+2+3+...+100: "<<result<<endl;
system("pause");
return 0;
}

运行结果:



方案三:虚函数
#include <iostream>
using namespace std;
class Father;
Father *ff[2];
class Father
{
public:
virtual int Sum(int n)
{
return 0;
}
};
class Son:public Father
{
public:
int Sum(int n)
{
return ff[!!n]->Sum(n-1)+n;
}
};

int main()
{
Father f;
Son s;
ff[0]=&f;
ff[1]=&s;
int result=ff[1]->Sum(100);
cout<<"虚函数:1+2+3+...+100: "<<result<<endl;
system("pause");
return 0;
}
运行结果:



方案四:函数指针(类似方案三)
#include <iostream>
using namespace std;
typedef int (*FUN)(int n);
int function1(int n)
{
return 0;
}
int function2(int n)
{
static FUN f[2]={function1,function2};//用函数地址为其初始化;
return n+f[!!n](n-1);
}
int main()
{
int result=function2(100);
cout<<"函数指针:1+2+3+...+100: "<<result<<endl;
system("pause");
return 0;
}
方案五:模板法
#include <stdio.h>
#include <iostream>
template <unsigned int n>struct Sum_Solutiion4
{
enum Value{N = Sum_Solutiion4<N-1>::N + n};
};
template <> struct Sum_Solutiion4<1>
{
enum Value{N = 1};
};
int main()
{
printf("%d\n", Sum_Solutiion4<1000>::N);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: