所述的Stern-Brocot树是级分的二进制树,其中每个级分是通过将两个级分在上面的水平相邻它的分子和分母获取。
它以“端点分数” 开头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
在船尾-Brocot树(的每次迭代n
次迭代),有2^n + 1
该序列中的元素,这是我们可以从归于一小部分0/2^n
到2^n/2^n
。每次新迭代都只是在每对连续分数之间插入一个分数“ halfway”。
这使得Stern-Brocot树在正有理数与0到1之间的二进制分数之间是一对一的映射,从而也证明了这两个集合具有相同的基数。
您的任务是编写一个程序或函数,给定最低有理数的分子和分母,确定与该分数在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)
。(任何尝试在具有最高设置位的指令集中尝试使用汇编程序解决方案的人都可能会想使用此方法)。