您的位置:首页 > 编程语言

110507 The Stern-Brocot Number System

2013-10-28 13:05 387 查看
#include <iostream>

using namespace std;

class SternBrocotNo
{
public:
SternBrocotNo(int x, int y) : m_x(x), m_y(y) {}

SternBrocotNo(const SternBrocotNo& other) : m_x(other.m_x), m_y(other.m_y) {}

bool operator == (const SternBrocotNo& other) const
{
return (m_x == other.m_x) && (m_y == other.m_y);
}

static SternBrocotNo GetMid(const SternBrocotNo& left, const SternBrocotNo& right)
{
return SternBrocotNo(left.m_x + right.m_x, left.m_y + right.m_y);
}

bool operator > (const SternBrocotNo& other) const
{
return (m_x * other.m_y) > (m_y * other.m_x);
}

private:
int m_x, m_y;
};

static void OutputSeq(
const SternBrocotNo& target, const SternBrocotNo& mid,
const SternBrocotNo& left, const SternBrocotNo& right)
{
if (target == mid)
{
cout << endl;
return;
}

if (target > mid)
{
cout << 'R';
SternBrocotNo newMid = SternBrocotNo::GetMid(mid, right);
OutputSeq(target, newMid, mid, right);
}
else
{
cout << 'L';
SternBrocotNo newMid = SternBrocotNo::GetMid(left, mid);
OutputSeq(target, newMid, left, mid);
}
}

static void Test()
{
SternBrocotNo left(0, 1), right(1, 0), mid(1, 1);

int x, y;
while(true)
{
cin >> x >> y;

if ((x * y) == 1)
return;

SternBrocotNo target(x, y);
OutputSeq(target, mid, left, right);
}
}

int main(int argc, char* argv[])
{
Test();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程