/*
这题在实践中挺没意义的 但是很考察所谓发散思维 其中也加深了对虚函数 函数指针的理解
一共几种方法 一一说吧
*/
#include<iostream>
#include<cstdio>
using namespace std;
class A{
public:
A(){++n;sum+=n;}
static int getsum()
{
return sum;
}
static void Reset()// 不写这个函数的话 只能用一次加法下次再加 那两个静态变量保持原来的值呢
{
n=sum=0;
}
private:
static int n;
static int sum;
};
int A::sum=0;
int A::n=0;
//第一种方法 通过构造函数和静态变量的方法 很简单
int Sum_solution_1(int n)
{
A::Reset();
A * tmp=new A[n];
delete[] tmp;
tmp=NULL;
return A::getsum();
}
/*
第二种方法 用虚函数 根据n是否为0 选择调用哪个 A 的返回0
!!n 当n非0时候返回1
*/
class A2{
public:
virtual int sum(int n){return 0;}
};
A2 * arr[2];
class B:public A2
{
virtual int sum(int n)
{
return n+arr[!!n]->sum(n-1);
}
};
int Sum_solution_2(int n)
{
A2 a;
B b;
arr[0]=&a;
arr[1]=&b;
int ans=arr[1]->sum(n);
return ans;
}
/*
第三种方法 定义函数指针 也是根据n的取值选择调用哪个函数
*/
typedef int (*fun)(int ) ;
int Sum_solution_3_teminator(int n)//这个函数就是当n是0 的时候返回0
{
return 0;
}
int Sum_solution_3(int n)
{
static fun f[2]={Sum_solution_3_teminator,Sum_solution_3};//这里是静态的因为只要定义一次 就可以了
return f[!!n](n-1)+n;
}
/*
第四种是在编译阶段 就计算好的 是用模板类的特性 把n==1时候的模板定义好
之后的定义要根据n-1的结果 这样 的缺点是 只能在代码中写好n 然后编译的时候计算
*/
template<int n> struct Sum_solution_4
{
enum value{N=Sum_solution_4<n-1>::N+n};
};
template<>struct Sum_solution_4<1>
{
enum value{N=1};
};
int main()
{
int n;
cout<<Sum_solution_4<100>::N<<endl;
while(cin>>n)
{
//cout<<Sum_solution_1(n)<<endl;
//cout<<Sum_solution_2(n)<<endl;
cout<<Sum_solution_3(n)<<endl;
}
return 0;
}
剑指offer面试题46求1+2+..+n不能用乘除法和选择循环,多种发散思维方法
最新推荐文章于 2019-06-11 10:10:49 发布