題目描述
小明很喜歡數學,有一天他在做數學作業時,要求計算出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。現在把問題交給你,你能不能也很快的找出所有和...