埃及分数的故事,古埃及分数

问题的说明

现在输入真的分数。 请把这个分数分解成埃及的分数。

分析问题

真分数:分子小于分母的分数,称为真分数。 真实得分的得分值小于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

下图:

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注