描述
分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。
注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!
如有多个解,请输出任意一个。
请注意本题含有多组样例输入!
输入描述:
输入一个真分数,String型
输出描述:
输出分解后的string
示例1
输入:
8/11
2/4
输出:
1/2+1/5+1/55+1/110
1/3+1/6
说明:
第二个样例直接输出1/2也是可以的
数学家斐波那契提出的一种求解埃及数的贪心算法,准确的算法表述应该是这样的:
设某个真分数的分子为a,分母为b;
把c=(b/a+1)作为分解式中第一个埃及数的分母;
将a-b%a作为新的a;
将b*c作为新的b;
如果a等于1,则最后一个埃及数为1/b,算法结束;
如果a大于1但是a能整除b,则最后一个埃及数为1/(b/a),算法结束;
否则重复上面的步骤。
专注
#include <stdio.h>
#if 1
#define dbg printf
#else
#define dbg
#endif
void calcu(int a, int b)
{
int q, r;
if(a == 0)
{
printf("\n");
}
else if(b%a == 0)
{
printf("1/%d\n", b/a);
}
else
{
q = b/a;
r = b%a;
printf("1/%d", q+1);
if(a-r != 0)
{
printf("+");
}
calcu(a-r, (q+1)*b);
}
}
int main(void)
{
int a, b;
while(scanf("%d%*c%d", &a, &b) != EOF)
{
if(b%a != 0)
{
calcu(a, b);
}
else
{
printf("1/%d\n", b/a);
}
}
return 0;
}