剑指offer46 求1+2+3...+n的和

问题描述

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

解决

  1. 利用构造函数求解
    创建该类的n个对象,在该类里定义两个静态成员变量n和sum,静态成员变量为所有对象所共享,在构造函数里对其操作。这样创建几个对象就调用几次构造函数,并加了多少次。
class Temp
{
public:
        Temp()
        {
             n++;
             sum+=n;
        }
        void Reset()
        {
             n=0;
             sum=0;
        }
        int GetSum()
        {
            return sum;
        }
private:
        static int n;
        static int sum;

}
int Sum_Solution(int n)
{
   Temp::Reset();
   Temp* a=new Temp[n];
   delete [] a;
   a=NULL;
   return GetSum();
}

2.利用虚函数求解
一个类中函数用于返回,一个类继承该类实现一个递归相加的函数并对基类的sum进行重写。定义两个基类的指针,一个指向基类对象,一个指向子类的对象。

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 Sum_Solution(int n) {
        A a;
        B b;
        Array[0]=&a;
        Array[1]=(A*)&b;
        return Array[1]->Sum(n);
        }

3.利用函数指针求解
利用上面的思路定义两个函数,一个是用来求和,一个作为结束条件

typedef int (*fun)(int)
int part1(int n)
{
  return 0;
}
int part2(int n)
{
static fun[2]={part1,part2};
return n+fun[!!n](n-1);
]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值