面試題57_2:和為S的連續正數序列
阿新 • • 發佈:2020-08-24
1 題目描述
小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!
2 輸入
S
3 輸出
輸出所有和為S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序
4 樣例輸入
100
5 樣例輸出
9,10,11,12,13,14,15,16
18,19,20,21,22
6 求解思路
雙指標法
7 C++版本程式碼如下
vector<vector<int> > FindContinuousSequence(int sum){ vector<vector<int> > ans; if(sum < 3) return ans; int small = 1; int big = 2; int middle = (sum + 1) >> 1; int curSum = 0; while(small < middle){ curSum = 0; for(int i = small; i <= big; i++) curSum += i; if(curSum == sum){ vector<int> ansNow; for(int i = small; i <= big; i++) ansNow.push_back(i); ans.push_back(ansNow); // 繼續 small++; big++; } // 大了 else if(curSum > sum) small++; else if(curSum < sum) big++; } for(int i = 0; i < ans.size(); i++){ for(int j = 0; j < ans[i].size(); j++) cout<<ans[i][j]<<" "; cout<<endl; } return ans; } // 暴力列舉for迴圈的虛擬碼 for(int i = 1; i < middle; i++){ for(int j = i + 1; j <= middle; j++){ if(sumM(i, j) == sum) //add else if(sumM(i, j) > sum) break; else continue; } }