스턴 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
. 각각의 새로운 반복은 단순히 각각의 연속 분수 쌍 사이에 하나의 분수 "하프 웨이"를 삽입합니다.
이로 인해 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)
입니다. get-highest-set-bit를 가진 명령어 세트에서 어셈블러 솔루션을 시도하는 사람은 아마도이 접근법을 사용하고 싶을 것입니다.