剑指offer面试题46求1+2+..+n不能用乘除法和选择循环,多种发散思维方法

/*
这题在实践中挺没意义的 但是很考察所谓发散思维 其中也加深了对虚函数 函数指针的理解
一共几种方法 一一说吧
*/
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值