和為S的連續正數序列——牛客網(劍指offer)
阿新 • • 發佈:2018-03-19
http cti code 題目 作業 OS enc www. count-1
題目描述
小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!
輸出描述:
輸出所有和為S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序
題目鏈接 https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
思路一:
設置startNum,endNum,初值分別為1,2
startNum暫時固定,endNum往後移動,計算[startNum,endNum]之間的數值和sum。當sum等於S,做記錄;當sum>S,跳出裏層循環。startNum後移一位,在執行上述過程。startNum取值範圍一般定為1~S/2。
思路二:
利用等差數列的求和公式
sum = a1*n + n*(n-1)*d/2
由題意可知,相鄰項之差為1,即d=1;
sum = a1*n + n*(n-1)*/2
又可知a1≥1;所以
sum > n + n*(n-1)*/2 ===> 2sum > n^2 + n ===> 2sum > n^2 ===> n < sqrt(2sum) public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>(); int maxCount = (int) (Math.sqrt(sum * 2.0)+1); while (maxCount > 1) { int markNum = sum - maxCount * (maxCount-1) / 2; if ( markNum > 0 && markNum % maxCount == 0 ) { int index = maxCount; int start = markNum / maxCount; ArrayList<Integer> list = new ArrayList<Integer>(); while (index > 0){ list.add(start); start++; index--; } lists.add(list); } maxCount--; } return lists; }
和為S的連續正數序列——牛客網(劍指offer)