今天我们还是讲贪心算法。题目是:将一个真分数表示成若干个埃及分数的和。啥是埃及分数?例如:1/2这就是埃及分数,也就是分子为1的分数。例如:7/8=1/2+1/3+1/24。
那么怎么实现这个呢?
因为是加法运算,所以我们通过一项项的“拆项”来实现。
1.找出最大的埃及分数,使得f>1/n。
2.输出1/n.
3.f=f-1/n.
4.如果f是埃及分数则完成,否则继续第一步.
但是先要注意,高级语言不支持分数的运算,所以表示分数我们只能分别输入分子和分母。设分子是A,分母是B。则B/A的上为C,余数为K,B=A*C+K.。则B/A=C+K/A,而K<A,则K/A<1,所以B/A<c+1,令C+1=D,则A/B>1/D,因此我们求出了上面说的n。
其次,A/B-1/D=(AD-B)/BD,所以要分别计算A,D,B的值,然后对他们进行运算。
最后,当A=1,我们就完成了。还可以A!=1,但是A和B是倍数关系,这样也可以。
代码:就不贴主函数了。
int fz,fm,n;
scanf("%d %d",&fz,&fm);//输入分子和分母
printf("%d/%d=",fz,fm);
if (fz>fm)
{
printf("ERROR");
}
else if ((fm%fz==0)||fz==1)
{
printf("%d/%d",fz,fm);
}
else
{
while(fz!=1)
{
n=fm/fz+1;
printf("1/%d+",n);
fz=fz*n-fm;
fm=fm*n;
if (fz==1)
{
printf("1/%d",fm);
}
if ((fz>1)&&(fm%fz==0))
{
printf("1/%d",fm/fz);
fz=1;//用来结束循环
}
}
}