題目要求
問題描述:一個正整數有可能可以被表示為 n(n>=2) 個連續正整數之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
編寫程序,根據輸入的任何一個正整數,找出符合這種要求的所有連續正整數序列。
樣例輸入:15
樣例輸出:1+2+3+4+5
4+5+6
7+8
解決方案
題意很好懂,這個題第一直覺想到的是三重循環暴力破解,第一重控制序列起點,第二重控制序列元素個數,第三重輸出符合題意的序列,但是顯然,這樣很費時,可不可以改進?可以!
因為是連續的序列,考慮使用等差數列性質。
對於等差序列,有三個關鍵的變量:一個是公差,一個是序列起點,另一個是序列長度。顯然這序列公差為1,那么只考慮序列起點start和序列長度n。回味等差數列求和公式:
由上面的公式可以得出下面的信息:
1.將上式稍加變形,2S-(n-1)n=2a*n,即2S>(n-1)n>0。
2.又2S=(2a+n-1)n,故:2S%n==0,(2S/n-n+1)%2==0。
3.a=(2S/n-n+1)/2
所以,可以考慮用控制序列長度的方式直接求出符合題意的序列起點,然后輸出。
源碼示例
結果展示
小結
題目雖簡單,但還是需要多加考慮,不要一上來就弄個三重循環...