和為S的連續正數序列

2021-08-19 02:28:07 字數 1818 閱讀 5648

題目描述

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

輸出描述:

輸出所有和為s的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序

解題思路1:

因為是等差數列,且差為1。

sum= (a1+an)*n/2

n-1= (an-a1)/1

so:n=an-a1+1

sum=(a1+an)*(an-a1+1)/2

目標值為tsum。

令兩個指標,low和high,如果然後利用公式求和,如果sum小於tsum,則high++,大於tsum則low++,等於則加入結果中。

迴圈條件是low < high,因為當high==tsum後high就不會再自加了,low一直自加直到大於high,迴圈結束,所以這個迴圈條件就滿足判斷了。

class

solution:

deffindcontinuoussequence

(self, tsum):

# write code here

if tsum <3: return

low = 1

high = 2

result =

while low 1) / 2

if cur > tsum:

low +=1

elif cur < tsum:

high += 1

else:

temp =

for i in range(low,high+1):

low+=1

return result

print(solution().findcontinuoussequence(14))

根據數學公式計算:

(a1+an)*n/2=s n=an-a1+1

(an+a1)*(an-a1+1)=2*s=k*l(令k=an+a1,l=an-a1+1,所以k>l)

an=(k+l-1)/2 a1=(k-l+1)/2

所以只用求出k和l為整數即可。其中k和l必須乙個為偶數,乙個為奇數,這樣才能保證an和a1也為整數。

因為k>l,所以且k*l=2s,所以l<(2s)**(1/2)。

class

solution:

deffindcontinuoussequence

(self, tsum):

# write code here

if tsum < 3: return

s = int(math.sqrt(2 * tsum))

result =

for l in range(s, 1, -1):

if2 * tsum % l == 0:

k = int(2 * tsum / l)

if (k & 1

andnot l & 1) or (not k & 1

and l & 1):

a1 = int((k - l + 1) / 2)

an = int((k + l - 1) / 2)

temp =

for i in range(a1, an + 1):

return result

和為S的連續正數序列

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

和為S的連續正數序列

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

和為S的連續正數序列

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