找人做网站怎么做/资源
描述
分子为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
#endifvoid 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;
}