Дерево Штерна-Броко є бінарним деревом фракцій , де кожна фракція набувається шляхом додавання чисельнику і знаменника двох фракцій сусідніх його в зазначених вище рівнях.
Він генерується, починаючи з , 0/1
і в 1/0
якості «кінцевих фракцій», а звідти, ітерація, поміщаючи одну фракцію між кожними двома послідовними парою фракцій шляхом додавання чисельнику і знаменнику цих фракцій разом, наприклад , так:
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
У кожній ітерації дерева Стерн-Броко (The n
й ітерації), є 2^n + 1
елементи в послідовності, до якої можна приписати фракції від 0/2^n
до 2^n/2^n
. Кожна нова ітерація просто вставляє один дріб "на половину" між кожною парою послідовних дробів.
Це робить дерево Стерна-Брокота однозначним відображенням між позитивними раціональними числами та двійковими дробами між 0 і 1, тим самим слугуючи доказом того, що два набори мають однакову кардинальність.
Ваше завдання - написати програму або функцію, яка, враховуючи чисельник і знаменник додатного раціонального числа в найнижчих значеннях, визначає двійковий дріб, який відповідає позиції цього дробу на дереві Штерна-Брокота.
Приклади входів і виходів наведені нижче:
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)
Вхідні дані, які вам не потрібно підтримувати, але включаються для довідок:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
Виграє найкоротша програма будь-якої мови для досягнення цієї мети.
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
і т.д.). Якщо число так генерується для вузла n
, а потім 2^lg n
(двійковий журнал) є старшим битим безліччю в n
, і бажаному довічним дріб (2*(n - 2^lg n) + 1) / 2^(lg n + 1)
. (Кожен, хто намагається вирішити асемблер в наборі інструкцій з get-high-set-bit, ймовірно, захоче використовувати цей підхід).