題目:輸入乙個正數n,輸出所有和為n連續正整數序列。
例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以輸出3個連續序列1-5、4-6和7-8。
解法1
因為整數序列是有序的,可以設立兩個游標begin和end,通過判區間[begin,end]的和是否為n來得到這個序列。如果區間和大於n,begin往前移動,如果小於n,end往前移動,等於就輸出這個區間。時間複雜度是0(n)。
public void find(int n)
int begin = 1;
int end = 2;
int sum = begin + end;
while (begin < end && begin < (n+1)/2) else if (sum > n) else
}}
解法2
假設自然數n可以拆分成:m, m+1, …, m+k-1 (m >= 1, k >= 2),則 n = (m + m+k-1)*k/2 即 2*n = (2*m+k-1)*k。
由於(2*m+k-1)與k的奇偶性是相反的,因此,可以先將n的所有質因子2提取出來,得到:2 * n = 2^t * a * b,由於(2*m+k-1)與k的奇偶性相反,且(2*m+k-1) > k,當確定了a,b時,可得到2*n的兩組拆分(2^t * a, b) 和 (a, 2^t * b)(當a等於b時,這兩組拆分是一樣的),對每組拆分,k是較小的數。
public void find2(int n)
for (i = 1; ; i += 2) }
private void print(int i, int j)
劍指offer 和為S的連續正整數序列
題目 小明很喜歡數學,有一天他在做數學作業時,要求計算出9 16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100 至少包括兩個數 沒多久,他就得到另一組連續正數和為100的序列 18,19,20,21,22。現在把問題交給你,你能不能也很快的找出...
和為s的正整數序列
from typing import list deffindcontinuoussequence target int list list int i 1 滑動視窗的左邊界 j 1 滑動視窗的右邊界 sum 0 滑動視窗中數字的和 res while i target 2 ifsum target...
乙個正整數表示為n個連續正整數之和(第1屆第2題)
問題描述 乙個正整數有可能可以被表示為 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 題意很好懂,這個題第一直覺想到...