分数树

19世纪的时候,Moriz Stern(1858)与Achille Brocot(1860)发明了“一棵树”。据说,经由一些简单的规则而产生的这一棵树上,可以包含零以上所有的有理数。这棵树看起来大致这样: 此题 列 对应 我们传统的行

你观察出规则了吗?
首先,它们在第一列放两个“分数”,第一个是0/1,代表0;第二个是1/0,代表无穷大。接着它们一列一列的产生这棵树,当它们要产生第k+1列的时候,就先把前k列所有的分数按照大小排成一列(假设有n个),在这些数之间会有n-1个间隔,那么第k+1列就准备产生n-1个数,其值的分子恰好是左右两个数的分子的和,分母是左右两个数的分母的和。
例如,2/3,而它的2就是左边1/2的1和右边1/1的分子1相加的结果;而2/3的3,则是1/2的2加上1/1的分母1而得。 从这棵树中,我们可以看出,每个正的最简分数在这棵树中恰好出现一次,我们用字母“L”和“R”分别表示从树根(1/1)开始的一步“往左走”和“往右走”,则每一个数都可以由L和R组成的序列表示。
例如,LRRL表示从1/1开始往左走一步到1/2,然后往右走到2/3,再往右走到3/4,最后往左走到5/7。我们可以把LRRL看作5/7的一种表示法。几乎每个正分数均有唯一的方法表示成一个由L和R组成的序列。
给定一个分数,输出它的LR表示法。
【输入】
输入文件fraction.in有两个互为素数的正整数m和n(1<=n,m<=1000)。
【输出】
输出文件fraction.out为对应的LR表示法。
【输入】
5 7
【输出】
LRRL

思路(参考了网上dalao的基本思路)

一个结点的左儿子一定小于它,右儿子一定大于它,所以建一个名为cc[ ]的结构体,存储它左边那位的分子,分母以及右边那位的分子,分母以及自己的分子,分母;
将根结点初始化为1/1,并将它的左边右边以及它自己录入,然后开始搜索;
并且你又会发现,如果要寻找的那个比它小时,就会往左,接下来的那个结点就会继承它的左边,而那个结点的右边就会更新为当前搜索的结点,然后再继续搜索那个结点,一直到当前搜索的结点的值与要寻找的分数相等时就退出搜索。

代码

#include<bits/stdc++.h>
using namespace std;
double a,b,x,y;

struct fs{
    double left1,left2,right1,right2;
    double fm,fz;
}cc[1000050];

int find(int n){
    y=(cc[n].fz*1.0)/(cc[n].fm*1.0);
    if(x<y){
        cc[n+1].left1=cc[n].left1;
        cc[n+1].left2=cc[n].left2;
        cc[n+1].right1=cc[n].fz;
        cc[n+1].right2=cc[n].fm;
        cc[n+1].fz=cc[n].left1+cc[n].fz;
        cc[n+1].fm=cc[n].left2+cc[n].fm;
        cout<<"L";
        return find(n+1);
    } 
    if(x>y){
        cc[n+1].left1=cc[n].fz;
        cc[n+1].left2=cc[n].fm;
        cc[n+1].right1=cc[n].right1;
        cc[n+1].right2=cc[n].right2;
        cc[n+1].fz=cc[n+1].left1+cc[n+1].right1;
        cc[n+1].fm=cc[n+1].left2+cc[n+1].right2;
        cout<<"R";
        return find(n+1);
    }
    return 0;

}

int main(){
    freopen("fraction.in","r",stdin);
    freopen("fraction.out","w",stdout);
    cin>>a>>b;
    if(a==b)return 0;
    cc[0].left1=0;
    cc[0].left2=1;
    cc[0].right1=1;
    cc[0].right2=0;
    cc[0].fm=1;
    cc[0].fz=1;
    x=(a*1.0)/(b*1.0);
    find(0);

}
posted @ 2020-07-24 09:44  牛大了的牛大  阅读(538)  评论(0编辑  收藏  举报