写一题c++:埃及分数

一个老人将11匹马分给3个儿子,老大1/2,老二1/4,老三1/6。3个儿子正在无奈之际,邻居把自己家的马牵来,老大1/2,牵走了6匹;老二1/4,牵走了3匹;老三1/6,牵走了2匹。分完后,邻居把自己的马牵了回去。即11/12=1/2+1/4+1/6。这种分子是1的分数叫做埃及分数,因为古埃及人只使用分子是1的分数进行分数运算。
现输入一个真分数,请将该分数分解为埃及分数。 

输入描述

输入两个整数,表示分子和分母。

输出描述

输出分解后的埃及分数。

具体的实现过程如下:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 辗转相除法求最大公因数
int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

// 将分数化为最简形式
void reduce(int& p, int& q) {
    int d = gcd(p, q);
    p /= d;
    q /= d;
}

int main() {
    int p, q;
    cin >> p >> q;
    reduce(p, q);

    vector<int> egypt;
    while (p > 1) {  // 当分数不能再分解时即可退出循环
        int a = (q + p - 1) / p;  // 寻找下一个分解项
        egypt.push_back(a);  // 记录分解项
        p = a * p - q;
        q *= a;
        reduce(p, q);  // 将当前分数化简为最简形式
    }
    egypt.push_back(q);  // 最后一个分解项为1/q

    // 将埃及分数输出
    for (int i = 0; i < egypt.size(); i++) {
        cout << "1/" << egypt[i];
        if (i < egypt.size() - 1) {
            cout << " + ";
        }
    }
    cout << endl;
    return 0;
}

输入样例:

5 7

输出样例:

1/2 + 1/8 + 1/56

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个很正经的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值