分数树(fraction.pas/c/cpp)

本文介绍了十九世纪Moriz Stern和Achille Brocot发明的分数树,这棵树包含了所有正有理数。通过简单的规则生成分数树,每个正的最简分数在树中出现一次。文章提供了一个LR表示法来表示树中的分数,如LRRL表示5/7。给定互素的正整数m和n,任务是输出它们在分数树上的LR表示。文章还分享了求解思路和代码实现。
摘要由CSDN通过智能技术生成

【问题描述】
十九世纪的时候,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 组成的序列。
给定一个分

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据题意,我们可以先将两个分数的分子和分母分别相乘,再对结果进行约分,得到最终的乘积。 下面是代码实现: Fraction.h: ```c #ifndef FRACTION_H_INCLUDED #define FRACTION_H_INCLUDED typedef struct { int numerator; // 分子 int denominator; // 分母 } FRACTION; void FractionInput(FRACTION *p); void FractionOutput(const FRACTION *p); int Gcd(int a, int b); FRACTION FractionMul(const FRACTION *x, const FRACTION *y); #endif // FRACTION_H_INCLUDED ``` Fraction.c: ```c #include <stdio.h> #include "Fraction.h" // 输入分数 void FractionInput(FRACTION *p) { scanf("%d/%d", &p->numerator, &p->denominator); } // 输出分数 void FractionOutput(const FRACTION *p) { printf("%d/%d", p->numerator, p->denominator); } // 求最大公约数 int Gcd(int a, int b) { return b == 0 ? a : Gcd(b, a % b); } // 分数乘法 FRACTION FractionMul(const FRACTION *x, const FRACTION *y) { FRACTION res; res.numerator = x->numerator * y->numerator; res.denominator = x->denominator * y->denominator; int gcd = Gcd(res.numerator, res.denominator); res.numerator /= gcd; res.denominator /= gcd; return res; } ``` 在主函数中,我们可以调用 `FractionInput()` 输入两个分数,再调用 `FractionMul()` 计算它们的乘积,最后再调用 `FractionOutput()` 输出结果即可。 ```c #include <stdio.h> #include "Fraction.h" int main() { FRACTION a, b, p; FractionInput(&a); FractionInput(&b); p = FractionMul(&a, &b); FractionOutput(&p); putchar('\n'); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值