思路:
1. 暴力破解算法,从 [2, INT_MAX] 选择分母,组成埃及分数 1/Temp , 与原分数相减,得到新的真分数,继续选择 Temp,直到相减后的结果是0;
挑选 Temp 的时间复杂度为 O(n);
2. 贪心算法,假设原真分数为 0 < a / b < 1,令商 q = b / a,余数 r = b % a,可知真分数 a / b > 1/ (q+1) ,可以选择 q+1 作为暴力破解选出的分母 Temp,
然后相减,剩下的分数作为新的真分数,继续计算;挑选 Temp 的时间复杂度为 O(1);
题目描述
分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。
注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!
如有多个解,请输出任意一个。
请注意本题含有多组样例输入!
Example:
#include<cstdio>
using namespace std;
int main()
{
unsigned divident, divisor;
while(scanf("%u/%u", ÷nt, &divisor) != EOF) {
if(divident == 0) { printf("0\n"); continue; }
while(divident > 1) {
unsigned r = divisor % divident;
unsigned q = divisor / divident;
if(r == 0) {
divisor = q;
break;
}
printf("1/%d+", q+1);
divident -= r;
divisor *= q+1;
}
printf("1/%d\n", divisor);
}
}