标签搜索

目 录CONTENT

文章目录

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

小小城
2021-08-22 / 0 评论 / 0 点赞 / 6 阅读 / 1,728 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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

@[toc]

第一种方法:利用对象的特性

class assist {
public:
	//定义第一个对象时N++, N = 1,sum = 1;
	//第二个对象时,N++, N = 2,sum += N = 1 + 2;
	//第二个对象时,N++, N = 3,sum += N = 1 + 2 + 3;
	//......
	assist()
	{
		N++;
		sum += N;
	}

	static void reset() //因为可能会循环多组,又因为N和sum都是静态的,所以每次要进行重置
	{
		N = 0; 
		sum = 0; 
	}

	//返回结果
	static unsigned int GetSum()
	{ 
		return sum; 
	}

private:
	static int N;
	static int sum;
};

int assist::N = 0;
int assist::sum = 0;

//设置一个静态变量N和sum,在构造函数中进行累加运算;
//然后构造一个以辅助类为类型、大小为n的数组,重复调用此构造函数n次来实现n次的累加运算
class Solution {
public:
	int Sum_Solution(int n) {
		assist::reset();
		assist * p = new assist[n];
		delete[]p;
		p = nullptr;
		return assist::GetSum();
	}
};

第二种方法:使用模板函数

//第二种方法:使用模板函数进行编程,相当于使用模板实现递归,显示定义输入参数为1的模块,相当于递归的出口
template <int m> 
inline int SumTo() 
{
	return m + SumTo<m - 1>();
} 
template <> 
inline int SumTo<1>() 
{
	return 1;
}

第三种方法:使用虚函数

//第三种方法:使用虚函数


class Base {
public:
	virtual int Sum(int n)
	{
		return 0;
	}
};

Base* Array[2];//构成多态

class Derived : public Base
{
public:
	//当n大于0时,!!n = 1;当n等于0时,!!n 等于0;
	//当结果!!n = 1时,Array[1]->Sum(n - 1);注意Array[1]存的是派生类的对象,
	//相当于基类指针指向派生类,在派生类的虚函数表中找Sum函数,调用的是派生类的Sum
	//当结果!!n = 0时,Array[0]->Sum(n - 1);注意Array[0]存的是基类的对象,
	//相当于基类指针指向基生类,在基类的虚函数表中找Sum函数,调用的是基类的Sum
	//当结果!!n = 0时,基类return 0,是‘递归’的出口
	virtual int Sum(int n) 
	{ 
		return Array[!!n]->Sum(n - 1) + n; 
	}

};
//使用虚函数来构造递归,在基类中定义虚函数Sum(n)返回0,通过将指针数组的两个元素分别绑定到基类和派生类,其中基类的Sum()
//结束递归,!!n来构造true(1) false(0)来对指针数组进行访问
class Solution
{
public:
	int Sum_Solution(int n)
	{
		Base a;
		Derived b;
		Array[0] = &a;
		Array[1] = &b;
		return b.Sum(n);
	}
};

第四种方法:使用短路计算

//第四种方法
   //使用短路计算来构造递归:重点是输入0的时候输出0来结束递归
//缺点:递归的层数不能太深<3000

//相当于也是’递归‘
//当 n = 0时,0 &&(ret += Sum_Solution) 一定等于0,相当于递归出口
//当 n > 0时,n &&(ret += Sum_Solution) 结果与n无关,等于(ret += Sum_Solution(n - 1)),进行递归
class Solution 
{
public:
	int Sum_Solution(int n) 
	{
		int ret = n;
		n && (ret += Sum_Solution(n - 1));
		return ret;
	}
};
0

评论区