“埃及分数” 为分子为 1 的分数。人们研究较多且颇感兴趣的问题是:把一个给定的分数转化为若干个不相同的埃及分数之和,约定埃及分数的分母不能与给定分数的分母相同。常把分解式中埃及分数的个数最少,或在个数相同时埃及分数中最大分母为最小的分解式称为最优分解式。 输入描述 每组两个整数 p,q,分别表示分子和分母,p,q 均不超过 int 范围 输出描述 对应于每组输入,输出埃及分数之和,如果不能分解,或分解后存在某项分母大于 1000000,则输出 "No found!" 样例输入 7 8 123 125 样例输出 1/2+1/3+1/24 No found!
时间: 2024-03-07 13:48:47 浏览: 145
这道题可以使用贪心算法来求解。具体步骤如下:
1. 首先判断给定的分数是否已经是埃及分数,如果是则直接输出。
2. 如果不是,则从分数值最小的埃及分数1/2开始,依次判断能否加入到分解式中。
3. 如果能加入,则将其加入到分解式中,并更新给定分数的值;否则继续考虑下一个埃及分数。
4. 重复步骤3,直到给定分数被分解为若干个埃及分数之和,或者无法再加入新的埃及分数为止。
具体实现代码如下:
```c
#include <stdio.h>
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
int main() {
int numerator, denominator;
printf("请输入分子和分母:");
scanf("%d%d", &numerator, &denominator);
if (numerator == 1) {
printf("1/%d\n", denominator);
return 0;
}
printf("分解式为:");
int flag = 0;
while (numerator > 0) {
int k = denominator / numerator + 1;
while (1) {
int new_numerator = numerator * k - denominator;
int new_denominator = denominator * k;
if (new_numerator == 0 || new_denominator > 1000000) {
break;
}
int common = gcd(new_numerator, new_denominator);
new_numerator /= common;
new_denominator /= common;
if (new_denominator > denominator) {
k++;
continue;
}
printf("%s1/%d", flag == 0 ? "" : "+", new_denominator);
flag = 1;
numerator = new_numerator;
denominator = new_denominator;
}
if (numerator > 1 && denominator / numerator > 1000000) {
printf("No found!\n");
return 0;
}
k++;
}
printf("\n");
return 0;
}
```
需要注意的是,如果无法分解或分解后存在某项分母大于1000000,则需要输出"No found!"。
阅读全文