思路:不难发现,一个结点的左儿子一定小于它,右儿子一定大于它,所以建一个名为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);
//cout<<endl<<x<<' '<<y<<endl;
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);
}
京公网安备 11010502036488号