首页 > 编程语言 > 详细

The Stern-Brocot Number System(排序二进制)

时间:2015-10-04 14:42:52      阅读:387      评论:0      收藏:0      [点我收藏+]



The Stern-Brocot Number System

Input: standard input

Output: standard output

 

The Stern-Brocot tree is a beautiful way for constructing the set of all nonnegative fractions m / n where m and n are relatively prime. The idea is to start with two fractions 技术分享and then repeat the following operations as many times as desired:

Insert 技术分享between two adjacent fractions 技术分享and 技术分享.

For example, the first step gives us one new entry between 技术分享and 技术分享,

技术分享

and the next gives two more:

技术分享

The next gives four more,

技术分享

 

and then we will get 8, 16, and so on. The entire array can be regarded as an infinite binary tree structure whose top levels look like this:

 

技术分享

 

The construction preserves order, and we couldn‘t possibly get the same fraction in two different places.

We can, in fact, regard the Stern-Brocot tree as a number system for representing rational numbers, because each positive, reduced fraction occurs exactly once. Let‘s use the letters L and R to stand for going down to the left or right branch as we proceed from the root of the tree to a particular fraction; then a string of L‘s and R‘s uniquely identifies a place in the tree. For example, LRRL means that we go left from 技术分享down to 技术分享, then right to 技术分享, then right to 技术分享, then left to 技术分享. We can consider LRRL to be a representation of 技术分享. Every positive fraction gets represented in this way as a unique string of L‘s and R‘s.

Well, actually there‘s a slight problem: The fraction 技术分享corresponds to the empty string, and we need a notation for that. Let‘s agree to call it I, because that looks something like 1 and it stands for "identity".

In this problem, given a positive rational fraction, you are expected to represent it in Stern-Brocot number system.


Input

The input file contains multiple test cases. Each test case consists of a line contains two positive integers m and n where m and n are relatively prime. The input terminates with a test case containing two 1‘s for m and n, and this case must not be processed.


Output

For each test case in the input file output a line containing the representation of the given fraction in the Stern-Brocot number system.


Sample Input

5 7
878 323
1 1

 

Sample Output

LRRL
RRLRRLRLLLLRLRRR

题目大意:

求出给出数字在每一层树枝上的左边还是右边。

解题思路:

数的左边越来越小,右边越来越大,中间的1是分界点。


模板代码:

#include<iostream>
#include<string>
using namespace std;
///////////////////
struct Fraction{
    int m, n;
    Fraction(int a = 0, int b = 0){m = a; n = b;}
    bool friend operator == (Fraction f1, Fraction f2){
        return f1.m*f2.n == f2.m*f1.n;
    }
    bool friend operator < (Fraction f1, Fraction f2){
        return f1.m*f2.n < f2.m*f1.n;
    }
};
///////////////
class SBNumber{
private:
    Fraction x;  // from input
    string ans;  // for result
public:
    bool readCase(){cin >> x.m >> x.n; return (x.m != 1)||(x.n != 1);}
    void computing();
    void outAns(){cout << ans << endl;}
};
void SBNumber::computing(){
    Fraction lt = Fraction(0, 1);
    Fraction rt = Fraction(1, 0);
    ans.clear();
    while(lt < rt){
        Fraction mid = Fraction(lt.m + rt.m, lt.n + rt.n);
        if(mid == x){
            break;
        }else if(mid < x){
            ans.push_back('R');
            lt = mid;
        }else{// mid > x
            ans.push_back('L');
            rt = mid;
        }
    }
}
int main(){
    SBNumber sbn;
    while(sbn.readCase()){
        sbn.computing();
        sbn.outAns();
    }
    return 0;
}



代码:

#include<iostream>
#include<cstdio>
#include<string>

using namespace std;

int main(){
    int m,n,summ,sumn;
    while(cin>>m>>n&&(m!=1||n!=1)){
       string ans;
       int m0=0,m1=1;
       int n0=1,n1=0;
       while(1){
          summ=m0+m1;
          sumn=n0+n1;
          int temp=m*sumn-n*summ;
          if(temp>0){
              ans+='R';
              m0=summ;
              n0=sumn;
          }
          else if(temp==0) break;
          else{
              ans+='L';
              m1=summ;
              n1=sumn;
          }
       }
       cout << ans << endl;
    }
    return 0;
}


版权声明:本文博主原创文章,博客,未经同意不得转载。

The Stern-Brocot Number System(排序二进制)

原文:http://www.cnblogs.com/mengfanrong/p/4854522.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!