问题描述:
古埃及人喜欢用最少的分子为 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;
}
代码运行截图: