計算和為給定數的連續正整數數列

2021-05-27 16:27:49 字數 965 閱讀 2458

比如 sn = 100 時,總和為100 的連續正整數數列有

1100

218 19 20 21 22

39 10 11 12 13 14 15 16

對於這種演算法的設計,我們最容易想到的就是從 1 到 sn 迴圈遍歷所有的數,對於每個數再迴圈計算是否以這個數為起點總和正好是sn。這種演算法的時間複雜度大概是o(n*log2n), 也就是說如果這樣計算,當 sn = 100萬時,大概需要迴圈 2000萬次左右。 這樣做效率自然是比較低的。那麼我們有沒有比上述方法更高效的方法呢?答案是肯定的。

首先我們看等差數列求和的公式:sn=n(a1+an)/2=na1+n(n-1)/2

從這個公式我們不難看出當 sn 和 n 固定時求a1 是乙個線性函式:a1 = (sn – n(n-1)/2) / n

有了這個函式,優化這個演算法就很簡單了,我們只要把 n 從 1 開始遍歷,一直遍歷到 (sn – n(n-1)/2) < n 為止,就可以找到所有的符合條件的連續數列了,這個演算法的演算法複雜度為 2n 的平方根,也就是說當 sn = 100 萬時,只需要迴圈1414次就可以得到所有的數列。

題目:在1~500這500個整數中,找出連續相加等於500的數?

簡要分析:int x=

條件是:i+(i+1)+ ……+(i+k)=500 (1式)

運用等差數列求和公式:(k+1)*i+(k+1)*k/2=500 (2式)

其中i和k還有乙個隱藏關係i*k<500 (3式)

於是很自然得到如下解法:

<?php 

$sum = 500;

$max = 500;

for ($i = 1; $i <= $max; ++$i)

echo '';}

}?>

LEETCODE 和為s的連續正數數列

輸入乙個正整數 target 輸出所有和為 target 的連續正整數序列 至少含有兩個數 序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。示例 1 輸入 target 9 輸出 2,3,4 4,5 示例 2 輸入 target 15 輸出 1,2,3,4,5 4,5,6 7,8 最容易...

求和為n的連續正整數序列

題目 輸入乙個正數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來得到這個序列。如果區間和大於...

演算法訓練 連續正整數的和

演算法訓練 連續正整數的和 時間限制 1.0s 記憶體限制 256.0mb 問題描述 78這個數可以表示為連續正整數的和,1 2 3 12,18 19 20 21,25 26 27。輸入乙個正整數 n 10000 輸出 m 行 n有m種表示法 每行是兩個正整數a,b,表示a a 1 b n。對於多種...