一个老人将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