1. 程式人生 > >劍指Offer——和為S的連續正數序列

劍指Offer——和為S的連續正數序列

span 他在 int 順序 sse 不能 正確答案 fin i++

題目描述:

小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck! 輸入描述:
輸出所有和為S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序


分析:

假設 i,j 分別是第一個數和最後一個數,那麽根據 (i+j)*(j-i+1)/2=sum 可得 i+j-i^2+j^2=2*sum 。遍歷i從1到sum/2,求j。
由於 j+j^2=2*sum-i^2-i ,所以 j 可能取 floor(sqrt(2*sum-i^2-i)) ,如果 j 可取,則將 i 到 j 加入數組中。


代碼:

 1 class Solution {
 2 public:
 3     vector<vector<int> > FindContinuousSequence(int sum) {
 4         vector<vector<int> > seqs;
 5         for(int i = 1; i <= (sum >> 1); i++) {
 6             int j = floor(sqrt((sum << 1) + i * i - i));
 7             if
(i < j && i + j - i * i + j * j == (sum << 1)) { 8 vector<int> seq; 9 for(int k = i; k <= j; k++) 10 seq.push_back(k); 11 seqs.push_back(seq); 12 } 13 } 14 return seqs; 15 }
16 };

劍指Offer——和為S的連續正數序列