要求不能使用乘除法、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;
}