求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。

前幾天在牛客網上面做了這道題,以前曾經看過這道題目的優化算法,但是限制的條件沒有這麼多,可能人們先想到這道題,都是會用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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章