300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 求1+2+3+...+n 要求不能使用乘除法 for while if else switch case等关键字及条件判断语句(A?B:C)

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

时间:2022-02-14 08:40:00

相关推荐

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

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

文章目录

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)第一种方法:利用对象的特性第二种方法:使用模板函数第三种方法:使用虚函数第四种方法:使用短路计算

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

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;}};

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。