实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。

时间:2022-12-25 05:37:56

这是一道不是很中规中矩的问题,刚拿到他的时候我是很懵逼的,我就在想, 这怎么可能,加法不让用乘除,不让用循环,又不让用条件判断,想到了递归,又发现,不让用条件判断,好气人哦。
但是·仔细想想,其实可以用递归的变形来进行,不是吗?
那具体怎么实现呢,我们带码见,在代码中,我会增加相应的备注,帮助理解。
方法一

#include<iostream>
#include<stdlib.h>
using namespace std;

int sum(int n){
return n>0 ? n + sum(n - 1) : 0;//有没有觉的跟递归很像呢?
//是的,这也是递归,只是看着跟平常的不太一样
//当n=0则返回,否者不断累加
}

int main()
{
cout << sum(100) << endl;
system("pause");
return 0;
}

方法二

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int(*fun)(int);//将fun声明为int型,参数是int的函数指针

int func1(int n)
{
return 0;
}

int func2(int n)
{
fun arr[2] = { func1, func2 };//函数指针数组
return n + arr[!!n](n-1);//到底用那个函数呢?根据n来定
//非0的n,在一次!后变为0,!0=1,所以你懂得
//这也是递归的一种变形
}

int main()
{
cout << func2(100) << endl;
system("pause");
return 0;
}

方法三:

//该方法是递归方法的进阶,由B类中的getSum(n)+N,到A类中的getSum(n)=0,一步一步类加上去
#include<iostream>
#include<stdlib.h>
using namespace std;

class A;
A* arr[2];
class A
{
public:
virtual int getSum(int n)
{
return 0;
}
};

class B:public A
{
public:
virtual int getSum(int n)
{
return arr[!!n]->getSum(n-1)+n;
}
};

int main()
{
A a;
B b;
arr[0] = &a;
arr[1] = &b;
cout << arr[1]->getSum(100) << endl;
system("pause");
return 0;
}

方法四:
静态成员就好比全局变量,初始化一次,之后不断累加,那么创建n个对象,n个对象中的sum依次累加,依次释放创建的对象

#include<iostream>
#include<stdlib.h>
using namespace std;

class Temp
{
public:
Temp()
{
N++;
Sum += N;
}

static void Reset()
{
N = 0;
Sum = 0;
}

static int GetSum()
{
return Sum;
}
private:
static int N;
static int Sum;
};

int Temp::N = 0;
int Temp::Sum = 0;

int solution_Sum(int n)
{
Temp::Reset();

Temp *a = new Temp[n];//创建n个对象
delete[]a;
a = NULL;

return Temp::GetSum();
}

int main()
{
cout << solution_Sum(100) << endl;
system("pause");
return 0;
}

当然方法还有很多,只是这几种自己比较熟悉,如果有什么疑问,可以在下面评论,我会尽快回复的。感谢你的阅读,谢谢。