スターン- Brocotツリーは、各画分を上記のレベルでそれを隣接する2つの画分の分子と分母を添加することにより取得された画分の二分木です。
それは始まることによって生成される0/1
と1/0
そうように、一緒にこれらの画分の分子と分母を加えることによって分画の各連続対の間の1つの部分を配置することによって、反復、「エンドポイント画分」として、そこから:
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
Stern-Brocotツリーの各反復(n
th番目の反復)に2^n + 1
は、シーケンス内の要素があり、そこから0/2^n
に分数を割り当てることができ2^n/2^n
ます。新しい反復のたびに、連続する分数の各ペアの間に「中間」に1つの分数が挿入されます。
これにより、Stern-Brocotツリーは、正の有理数と0〜1の2進小数との間の1対1マッピングになり、2つのセットのカーディナリティが同じであるという証拠にもなります。
あなたの仕事は、最低項の正の有理数の分子と分母を与えられて、Stern-Brocotツリーにおけるその分数の位置に対応するバイナリ分数を決定するプログラムまたは関数を書くことです。
入力と出力の例を以下に示します。
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-highest-set-bitを使用して命令セットでアセンブラーソリューションを試行する場合は、おそらくこのアプローチを使用することをお勧めします)。