Cách nhanh nhất để làm điều đó là gì?Với số tự nhiên A, tôi muốn tìm tất cả các cặp số tự nhiên (B, C) sao cho B * C * (C + 1) = A
aproach đơn giản của tôi:
for (C = 1;C<sqrt(A);C++) {
B=A/(C*(C+1));
if B is natural then add B,C to the list of possible pairs.
}
Nó có thể được thực hiện trong vòng chưa đầy O (sqrt (A))?
Giải pháp
Như Egor Skriptunoff câu trả lời, nó có thể được thực hiện một cách dễ dàng trong thời gian O (cube_root (A)).
Dưới đây là triển khai javascript đơn giản.
function findBCs(A) {
if (A/2 != Math.floor(A/2)) return [];
var solution = [];
var i;
var SR3 = Math.pow(A, 1/3);
for (i = 1; i <= SR3; i++) {
var B, C;
C = i;
B = A/(C * (C + 1));
if (B == Math.floor(B)) {
solution.push([B, C]);
}
B = i;
C = (-1 + Math.sqrt(1 + 4 * A/B))/2;
if (C == Math.floor(C)) {
solution.push([B, C]);
}
}
return solution;
}
Tôi chấp nhận câu trả lời của Meh vì nó sẽ tốt hơn (ngoài việc triển khai phức tạp hơn một chút và tôi chưa thử nghiệm).
Tôi không nghĩ rằng tác phẩm B này không bao giờ thay đổi – aaronman
1. Có vẻ như khó tin rằng có nhiều cặp đáp ứng yêu cầu này. 2. Bạn chỉ có thể tìm kiếm các cặp đó thông qua 'divisiors' của A, nhưng điều này vẫn sẽ dùng O (sqrt (A)). – Cristy
Bạn có thể ngay lập tức bảo lãnh với bộ trống nếu A là số lẻ – mvp