求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)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關(guān)鍵字及條件判斷語(yǔ)句(A?B:C)
文章目錄
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關(guān)鍵字及條件判斷語(yǔ)句(A?B:C)
- 第一種方法:利用對(duì)象的特性
- 第二種方法:使用模板函數(shù)
- 第三種方法:使用虛函數(shù)
- 第四種方法:使用短路計(jì)算
第一種方法:利用對(duì)象的特性
class assist { public://定義第一個(gè)對(duì)象時(shí)N++, N = 1,sum = 1;//第二個(gè)對(duì)象時(shí),N++, N = 2,sum += N = 1 + 2;//第二個(gè)對(duì)象時(shí),N++, N = 3,sum += N = 1 + 2 + 3;//......assist(){N++;sum += N;}static void reset() //因?yàn)榭赡軙?huì)循環(huán)多組,又因?yàn)镹和sum都是靜態(tài)的,所以每次要進(jìn)行重置{N = 0; sum = 0; }//返回結(jié)果static unsigned int GetSum(){ return sum; }private:static int N;static int sum; };int assist::N = 0; int assist::sum = 0;//設(shè)置一個(gè)靜態(tài)變量N和sum,在構(gòu)造函數(shù)中進(jìn)行累加運(yùn)算; //然后構(gòu)造一個(gè)以輔助類為類型、大小為n的數(shù)組,重復(fù)調(diào)用此構(gòu)造函數(shù)n次來實(shí)現(xiàn)n次的累加運(yùn)算 class Solution { public:int Sum_Solution(int n) {assist::reset();assist * p = new assist[n];delete[]p;p = nullptr;return assist::GetSum();} };第二種方法:使用模板函數(shù)
//第二種方法:使用模板函數(shù)進(jìn)行編程,相當(dāng)于使用模板實(shí)現(xiàn)遞歸,顯示定義輸入?yún)?shù)為1的模塊,相當(dāng)于遞歸的出口 template <int m> inline int SumTo() {return m + SumTo<m - 1>(); } template <> inline int SumTo<1>() {return 1; }第三種方法:使用虛函數(shù)
//第三種方法:使用虛函數(shù)class Base { public:virtual int Sum(int n){return 0;} };Base* Array[2];//構(gòu)成多態(tài)class Derived : public Base { public://當(dāng)n大于0時(shí),!!n = 1;當(dāng)n等于0時(shí),!!n 等于0;//當(dāng)結(jié)果!!n = 1時(shí),Array[1]->Sum(n - 1);注意Array[1]存的是派生類的對(duì)象,//相當(dāng)于基類指針指向派生類,在派生類的虛函數(shù)表中找Sum函數(shù),調(diào)用的是派生類的Sum//當(dāng)結(jié)果!!n = 0時(shí),Array[0]->Sum(n - 1);注意Array[0]存的是基類的對(duì)象,//相當(dāng)于基類指針指向基生類,在基類的虛函數(shù)表中找Sum函數(shù),調(diào)用的是基類的Sum//當(dāng)結(jié)果!!n = 0時(shí),基類return 0,是‘遞歸’的出口virtual int Sum(int n) { return Array[!!n]->Sum(n - 1) + n; }}; //使用虛函數(shù)來構(gòu)造遞歸,在基類中定義虛函數(shù)Sum(n)返回0,通過將指針數(shù)組的兩個(gè)元素分別綁定到基類和派生類,其中基類的Sum() //結(jié)束遞歸,!!n來構(gòu)造true(1) false(0)來對(duì)指針數(shù)組進(jìn)行訪問 class Solution { public:int Sum_Solution(int n){Base a;Derived b;Array[0] = &a;Array[1] = &b;return b.Sum(n);} };第四種方法:使用短路計(jì)算
//第四種方法//使用短路計(jì)算來構(gòu)造遞歸:重點(diǎn)是輸入0的時(shí)候輸出0來結(jié)束遞歸 //缺點(diǎn):遞歸的層數(shù)不能太深<3000//相當(dāng)于也是’遞歸‘ //當(dāng) n = 0時(shí),0 &&(ret += Sum_Solution) 一定等于0,相當(dāng)于遞歸出口 //當(dāng) n > 0時(shí),n &&(ret += Sum_Solution) 結(jié)果與n無關(guān),等于(ret += Sum_Solution(n - 1)),進(jìn)行遞歸 class Solution { public:int Sum_Solution(int n) {int ret = n;n && (ret += Sum_Solution(n - 1));return ret;} };總結(jié)
以上是生活随笔為你收集整理的求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中的deque、stack、que
- 下一篇: 网络编程套接字(二)