Cây Stern-Brocot là cây nhị phân của các phân số trong đó mỗi phân số có được bằng cách thêm các tử số và mẫu số của hai phân số lân cận nó ở các cấp độ trên.
Nó được tạo bằng cách bắt đầu bằng 0/1
và 1/0
dưới dạng "phân số điểm cuối" và từ đó, lặp đi lặp lại bằng cách đặt một phân số giữa mỗi cặp phân số liên tiếp bằng cách thêm tử số và mẫu số của các phân số đó với nhau, như vậy:
0. 0/1 1/0
1. 0/1 1/1 1/0
2. 0/1 1/2 1/1 2/1 1/0
3. 0/1 1/3 1/2 2/3 1/1 3/2 2/1 3/1 1/0
4. 0/1 1/4 1/3 2/5 1/2 3/5 2/3 3/4 1/1 4/3 3/2 5/3 2/1 5/2 3/1 4/1 1/0
Trong mỗi lần lặp của cây Stern-Brocot ( n
lần lặp thứ), có 2^n + 1
các phần tử trong chuỗi, theo đó chúng ta có thể gán một phân số từ 0/2^n
đến 2^n/2^n
. Mỗi lần lặp mới chỉ cần chèn một phần "nửa chừng" giữa mỗi cặp phân số liên tiếp.
Điều này làm cho cây Stern-Brocot ánh xạ một-một giữa các số hữu tỷ dương và các phân số nhị phân giữa 0 và 1, do đó cũng đóng vai trò là một bằng chứng cho thấy hai tập hợp có cùng số lượng.
Nhiệm vụ của bạn là viết một chương trình hoặc hàm, cho tử số và mẫu số của một số hữu tỷ dương theo các giá trị thấp nhất, xác định phân số nhị phân tương ứng với vị trí của phân số đó trong cây Stern-Brocot.
Ví dụ về đầu vào và đầu ra được cung cấp dưới đây:
2/3 -> 3/8 (4th number in iteration 3)
4/7 -> 9/32 (between 1/2 and 3/5 in the chart above)
1/1 -> 1/2 (middle number in the first iteration)
Đầu vào bạn không cần hỗ trợ, nhưng được đưa vào để tham khảo:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
Chương trình ngắn nhất trong bất kỳ ngôn ngữ nào để đạt được mục tiêu này sẽ giành chiến thắng.
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
, vv). Nếu số được tạo cho một nút là n
, thì 2^lg n
(nhật ký nhị phân) là bit được đặt cao nhất n
và phân số nhị phân mong muốn là (2*(n - 2^lg n) + 1) / 2^(lg n + 1)
. (Bất cứ ai đang thử một giải pháp trình biên dịch mã trong một tập lệnh có bit-set-set-bit có thể sẽ muốn sử dụng phương pháp này).