劍指offer 和為 s 的連續正數序列

2021-08-04 15:30:18 字數 1237 閱讀 7216

輸入乙個正數 s,列印出所有和為 s 的連續正數序列(至少兩個數)。

例如輸入 15,由於 1+2+3+4+5=4+5+6=7+8=15,所以結果打出 3 個連續序列 1~5、4~6 和 7~8。

考慮用兩個數 small 和 big 分別表示序列的最小值和最大值。首先把 small 初始化為 1,big 初始化為 2。如果從 small 到 big 的序列的和大於 s,我們可以從序列中去掉較小的值,也就是增大 small 的值。如果從 small 到 big 的序列的和小於 s,我們可以增大 big,讓這個序列包含更多的數字。因為這個序列至少要有兩個數字,我們一直增加 small 到(1+s)/2為止。

以求和為 9 的所有連續序列為例,我們先把 small 初始化為 1,big 初始化為 2。此時介於 small 和 big 之間的序列是{1,2},序列的和為 3,小於 9,所以我們下一步要讓序列包含更多的數字。我們把 big 增加 1 變成 3,此時序列為{ i, 2,坷。由於序列的和是 6,仍然小於 9,我們接下來再增加 big 變成 4,介於 small 和 big 之間的序列也隨之變成{ l, 2, 3, 4}。由於列的和 10 大於 9,我們要刪去去序列中的一些數字, 於是我們增加 small 變成 2,此時得到的序列是{2, 3, 4},序列的和e好是 9。我們找到了第乙個和為 9 的連續序列,把它列印出來。接下來我們再增加 big,重複前面的過程,可以找到第二個和為 9 的連續序列{4,5}。

public static list

<

list

<

integer

>> findcontinuoussequence(int sum)

int small =

1; int big =

2; int middle = (1

+sum) /

2; int cursum = small + big;

while (small < middle)

result.add(list);

}while (cursum >

sum&& small < middle)

result.add(list);}}

big++;

cursum += big;

}return result;

}

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

小明很喜歡數學,有一天他在做數學作業時,要求計算出9 16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100 至少包括兩個數 沒多久,他就得到另一組連續正數和為100的序列 18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和...

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

小明很喜歡數學,有一天他在做數學作業時,要求計算出9 16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100 至少包括兩個數 沒多久,他就得到另一組連續正數和為100的序列 18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和...

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

小明很喜歡數學,有一天他在做數學作業時,要求計算出9 16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100 至少包括兩個數 沒多久,他就得到另一組連續正數和為100的序列 18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和...