问题的说明
现在输入真的分数。 请把这个分数分解成埃及的分数。
分析问题
真分数:分子小于分母的分数,称为真分数。 真实得分的得分值小于1。 例如1/2、3/5、8/9等。
分子是1的分数,称为单位分数。 古埃及人在进行分数运算时,分子只使用1的分数。 因此,该得分也称为埃及得分,或单分子得分。 例如8/11=1/2 1/5 1/55 1/110。
分子和分母都是自然数,我们保证分数的分子用a表示,分母用b表示。
如果真分数的分子b能除尽分母a,真分数就能被简化得到埃及分数; 如果真分数的分子不能被分母整除,可以从原始分数中求解分母为b/a ) 1的埃及分数。 用这种方法反复分解剩下的部分,最终会得到结果。
算法设计
把真正的分数分解为埃及的分数的想法可以总结如下。
1)分数的分子用a表示,分母用b表示,变量c用于存储各个埃及分数的分母。
)2)如果分母是分子的倍数,则直接成为约埃及的分数。
此时,埃及分数的分母c=b/a; 分子为1意味着将变量a直接代入1。
3)否则,分数中必然包含分母为b/a ) 1的埃及分数。
如果分母不是分子的倍数,则可以分解为分母为b/a ) 1的埃及分数,即变量c的值为b/a ) 1。
)4)如果分子为1,则表示已经是埃及分数,无需再分解,结束。
因为如果分数的分子a是1的话,这时分数的本身就不需要埃及的分数再分解,就可以结束循环了。 不受这些循环条件的限制,如果满足某个条件时可以终止循环,则可以通过break语句实现。
ifa==1) )。
{
printf1/%LDn ),c );
黑; /*a为1标志结束*
) ) ) ) )。
)5)分子为3、分母为偶数时,直接分解为两个埃及分数1/b/2 )和1/b,然后结束。 因为分母是偶数,所以b—变量为2的倍数,约分成分解后的分数1/b/2 )后,一定能得到埃及的分数。 原始分数分解为两个埃及分数后,可以使用break语句结束循环。
ifa==3b%2==0)/*当馀数分子为3且分母为偶数时,为最后两个埃及分数) /
{
printf1/%LD1/%LDn )、b/2、b );
黑;
) ) ) ) )。
6 )从分数减去这个分母是b/a ) 1的埃及分数,然后返回步骤2)重复上述过程。
分解了这个埃及的分数后,用原来的分数a/b减去这个埃及的分数,得到了新的分数。 这个新分数的分子a=a*c-b,分母b=b*c。
由于整个程序没有明确的循环条件,为了能够继续循环,循环条件为非0的常数表示条件为真。 由以上过程可知,虽然在循环条件下无法结束循环,但在满足某个条件时使用break语句,仍然可以避免程序进入死循环。
当某个真分数分解为一个以上的埃及分数时最后输出时,要求以将各分数相加的形式输出,因此在输出文中“”作为普通文字输出。
printf1/%LD )、c );
程序流程图:
以下是完整的代码。
#包含
int main ) )
{
long int a、b、c;
请输入printf ‘选项得分a/b ) : ) );
scanf’%LD/%LD )、a和b ); /*输入分子a和分母b*/
可以分解为printf 它是: );
while1)。
{
ifB%A )/*分子不能被分母整除时,分母为b/a 1的埃及分数) /
c=b/a 1;
else /*否则,简化后的真实得分埃及得分) /
{
c=b/a;
a=1;
) ) ) ) )。
ifa==1) )。
{
printf1/%LDn ),c );
黑; /*a为1标志结束*
) ) ) ) )。
else
printf1/%LD )、c );
a=a * c – b; /*寻求过多的分子*
b=b * c; /*求馀数的分母*
ifa==3b%2==0)/*当馀数分子为3且分母为偶数时,为最后两个埃及分数) /
{
printf1/%LD1/%LDn )、b/2、b );
黑;
) ) ) ) )。
) ) ) ) )。
返回0;
) ) ) ) )。
执行结果:
linuxidc @ linuxidc ://www.linuxidc.com $./linuxidc.com
请输入可选的分数a/b ) :9/11
可以分解为:1/2 1/4 1/15 1/660
linuxidc @ linuxidc ://www.linuxidc.com $./linuxidc.com
请输入可选的分数a/b ) :3/4
可以分解为:1/2 1/4
下图: