110507 The Stern-Brocot Number System

来源:互联网 发布:马勒交响曲知乎 编辑:程序博客网 时间:2024/03/29 13:49


#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;}