的n
奇數序列的總和,可以乘以值(n
)的數目的平均值(中點m
)來計算,所以:
sum = 5 + 7 + 9 = m * n = 7 * 3 = 21
sum = 5 + 7 + 9 + 11 = m * n = 8 * 4 = 32
如果n
是奇數然後m
將是奇數,並且如果n
甚至然後m
將是偶數。
的first
和last
數字序列可以計算爲:
first = m - n + 1 = 8 - 4 + 1 = 5
last = m + n - 1 = 8 + 4 - 1 = 11
其他有趣的公式:
m = sum/n
m = (first + last)/2
last = first + (n - 1) * 2 = first + 2 * n - 2
m = (first + first + 2 * n - 2)/2 = first + n - 1
的最長序列將不得不開始與可能的最低first
值,意思是1
,所以我們得到:
sum = m * n = (first + n - 1) * n = n * n
這意味着任何給定sum
的最長序列長度至多可以是sqrt(sum)
。
於是開始sqrt(sum)
和搜索,直到我們找到一個有效的n
:
/**
* Returns length of sequence, or 0 if no sequence can be found
*/
private static int findLongestConsecutiveOddIntegers(int sum) {
for (int n = (int)Math.sqrt(sum); n > 1; n--) {
if (sum % n == 0) { // m must be an integer
int m = sum/n;
if ((n & 1) == (m & 1)) // If n is odd, mid must be odd. If n is even, m must be even.
return n;
}
}
return 0;
}
結果:
n = findLongestConsecutiveOddIntegers(160701) = 391
m = sum/n = 160701/391 = 411
first = m - n + 1 = 411 - 391 + 1 = 21
last = m + n - 1 = 411 + 391 - 1 = 801
由於sqrt(160701) = 400.875...
,結果在迭代發現( 400至391,含)。
結論:連續奇數的,以平等160701
金額最大:
21 + 23 + 25 + ... + 799 + 801 = 160701
您的循環要去看看奇集{1,3,5}也是甚至集{2,4,6}。所以你可能想說i + = 2而不是i ++。順便說一句,我喜歡上面的數學解決方案,而不僅僅是蠻力搜索。 – rajah9
http://mathforum.org/library/drmath/view/65469.html –
供參考:答案是** 391 **:'21 + 23 + 25 + ... + 799 + 801 = 160701' – Andreas