Дерево Штерна-Броко є бінарним деревом фракцій , де кожна фракція набувається шляхом додавання чисельнику і знаменника двох фракцій сусідніх його в зазначених вище рівнях.
Він генерується, починаючи з , 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, ймовірно, захоче використовувати цей підхід).