求1+2+3+.....+n的几种解法

题目描述: :求1+2+…+n,

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

话说这个一下子只能想到递归啦,但是还是要用到条件判断啊,于是乎这个怎么办尼?在网上各大牛的帮助下,找到了几个解法,收获颇多,分享之。。。

//求1+2+3...+n,不能用if,while,for,case,a?b:c,等
//solution2:一个构造函数初始化n次,每次在构造函数中加n,也可以求出结果
#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;}
};// !!n表示将一个整数变成1,即bool类型,如果是0的话,!!0仍然是0
int Solution1_Sum(int n)
{
    A a;
    B b;
    Array[0]=&a;
    Array[1]=&b;
    int value=Array[1]->Sum(n);
    return value;
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
#if 1
class C{
public:
    C(){n++;sum+=n;}
    static void Reset(){sum=0;n=0;}//这是为了在每次求n的和之前清零的
   static  int getSum(){return sum;}
private:
    static int n;
    static int sum;
};
int C::n=0;
int C::sum=0;
int Solution2_Sum(int n)
{
    C::Reset();
    //申明类数组,用一个指针指向他们
    C *p=new C[n];
    delete []p;//一定要记得释放空间哦,否则不仅指针空间没有释放,n个对象也不会调用析构函数的
    p=0;
    return C::getSum();//在没有对象的时候,对于一般的成员函数不能使用类名来调用,
    //故这里如果要这样用的话就要把getSum定义成staic函数
}
#endif
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef int (*fun)(int);//指的是定义一个返回值和参数类型都为Int的函数指针
int Solution_f1(int i)
{
    return 0;
}
int Solution_f2(int i)
{
    fun f[2]={Solution_f1,Solution_f2};
    return i+f[!!i](i-1);//调用f[0]或f[1],参数为i-1
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
int main()
{
    //solution2
    int all;
   all=Solution2_Sum(5);
   // all=solution1_Sum(5);
    cout<<all<<endl;
    //solution1
    all=Solution1_Sum(6);
    cout<<all<<endl;
    //solution3
    cout<<Solution_f2(10)<<endl;
    //solution4


}

注:今天又看到一种解法,共享之:

利用&&的短路性质,结束递归

int add_fun(int n)
{
int sum=0;
n && (sum=add_fun(n-1));
return sum+n;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值