前幾天在牛客網上面做了這道題,以前曾經看過這道題目的優化算法,但是限制的條件沒有這麼多,可能人們先想到這道題,都是會用for,while這樣的循環來做,這樣的做法就是最一般的做法。那次看這道題目時,那篇文章的作者是想告訴讀者,如果可以採用公式的話,儘量採用公式,所以我理所當然的採用了高斯公式求解,我擦,在線提交竟然通過了,高斯公式的答案就是:sum=(1+n)*n/2,但是這樣的做法使用了乘除,不符合題目的要求,但是竟然可以提交過去。我也是醉了。我給官方反應了這樣的錯誤,官方給我的回覆說沒有發現任何問題,不知道他們的檢查機制是什麼樣子的,廢話不說了,下面推薦兩種做法來解決這道題。
方法一:
首先在主函數中建立一個100個元素的對象數組,然後再構造函數中分別做id++,sum+=id。
#include<iostream>
using namespace std;
class Solution
{
public:
static int id;
static int sum;
Solution()
{
id++;
sum+=id;
}
int Sum_Solution()
{
return Solution::sum;
}
};
int Solution::id=0;
int Solution::sum=0;
int main(void)
{
Solution s[100];
cout<<s[5].Sum_Solution()<<endl;
return 0;
}
相信這種方法是大多數人看到這道題目所想到的方法,遞歸。那麼有一個問題就是沒有了if這種判斷語句,如何才能判斷遞歸的終止條件呢?這時候就需要利用&&的短路特性,那麼問題來了,什麼是短路特性?所謂的短路特性就是A&&B,當A爲真時,B需要做判斷,而當A爲假時,B不需要做判斷。所以:
#include<iostream>
using namespace std;
//注意:這裏的sum要麼用引用類型,要麼用指針類型,
//否則 每次遞歸都要在不同函數的棧上面 建立一個sum變量。
int Add(int n,int& sum)
{
n&&Add(n-1,sum);
return sum+=n;
}
int main(void)
{
int sum=0,n=100;
cout<<Add(n,sum)<<endl;
return 0;
}
運行環境:Win8.1+Dev-c++(5.6.1)