埃及分数问题

问题描述:

古埃及人喜欢用最少的分子为 1 的真分数来表示一个真分数,比如7 / 8 = 1 / 2 + 1 / 3 + 1 / 24 。设计程序把一个真分数表示为最少的埃及分数之和的形式。

思路:

首先要知道什么是真分数:真分数是指大于0小于1的所有分数。这些分数的特点是“分母大于分子”。

假设需要求解真分数 A / B (A 与 B 不可约),

那么假设 B = A * C + D, B / A = C + D / A < C + 1,A / B > 1 / (C + 1);

按照贪心的思想,1 / (C + 1) 为 A / B 分解中最大的那个分子为 1 的真分数。

假设 E = (C + 1),那么相减以后得到 A / B - 1 / E = (A * E - B ) / B * E,

那么得到新的A = A * E - B,B = B * E,然后对新的 A / B 进行约分,保证下一轮的 A 与 B 不可约。

如此循环,当 A = 1 是表明结束循环,得到答案。

Code:

#include<bits/stdc++.h>
using namespace std;
void  EgyptFraction(int A,int B){
	
 	cout << A << '/' << B << '=';
 	
    int E,R;
    while(A != 1){
        E = B / A + 1;  //B / A = C.
        cout << "1/" << E << '+';
        A = A * E - B;
        B = B * E;
        R = __gcd(A,B);
        if(R > 1){
            A /= R;
            B /= R;
        }
    }
    cout << "1/" << B;//A 是 1 了直接输出 1 / B 即可,此时结束分解。
}

int main(){
	
	int A,B;
	cin >> A >> B;
	
	EgyptFraction(A,B);
	
	return 0;
}

代码运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

那就随便一点

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

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

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

打赏作者

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

抵扣说明:

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

余额充值