我正在嘗試解決這個問題,該問題要求在給定間隔內找到具有連續因子 x(x 1) 的整數個數。2 = 1 * 2、6 = 2 * 3 等等,
為了找到可以分解為連續整數的數字的計數,這是我撰寫的函式,它取范圍內的每個正整數并將其平方根兩側的整數相乘以確定它是否可以分解為兩個連續整數.
我想知道是否可以使用此解決方案進行任何進一步的優化。
public int solve(int a, int b) {
int count = 0;
for (int i = a; i <= b; i ) {
if (i > 0) {
int sqrt = (int) Math.floor(Math.sqrt(i));
if (sqrt * (sqrt 1) == i) {
count ;
}
}
}
return count;
}
uj5u.com熱心網友回復:
根據您的解決方案,您需要計算兩倍三角數的值。
我們可以寫出這樣的值的數量不超過一些的運算式n
x * (x 1) <=n
x^2 x - n <= 0
求解二次不等式并取最大值x:
Discriminant = 1 4 * n
x1, x2 = (-1 - sqrt(Discriminant)) / 2
we need positive root
xmax = (-1 sqrt(Discriminant)) / 2
現在我們將這些值計算到b(包括)和a(不計算在內)a并得到差異。
示例:F(100) = 9, F(11) = 2,因此對于范圍 12..100,我們有 9-2=7 個值 (12,20,30,42,56,72,90)
在 Python 中(無特定語言):
from math import sqrt, floor
def conseq(a, b):
return floor((sqrt(1 4 * b) - 1) / 2) - floor((sqrt(4 * a - 3) - 1) / 2)
也許我們可能會因為浮點數學不確定性而錯過一些值(當 d.999999999999999 的地板給出 d 而不是 d 1 時),因此值得進行額外檢查:
xb = floor((sqrt(1 4 * b) - 1) / 2)
if (xb 1)*(xb 2)== b:
xb = 1
xa = floor((sqrt(4 * a - 3) - 1) / 2)
if (xa 1)*(xa 2) == a - 1:
xa = 1
return xb - xa
uj5u.com熱心網友回復:
首先,您的解決方案似乎不正確,條件i > 0是我能發現的第一個原因。問題應該是找到自然數,否則你不應該排除負整數。舉個例子a = -6 and b = 9。然后 -3 x -2 = 6 確實在 -6 到 9 的區間內。
但是考慮到您想要自然而不是整數a,那么是的,您可以通過在and之間迭代來進一步優化您的代碼(int) Math.floor(Math.sqrt(b))。由于乘法的結果將大于b
希望這足以讓您繼續前進。我的回答只是一個建議,我沒有實作并撰寫單元測驗來檢查它。在真正的實作中,您應該這樣做。
對于整數,它會更復雜一些。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504166.html
