标签:
今天我们还是讲贪心算法。题目是:将一个真分数表示成若干个埃及分数的和。啥是埃及分数?例如: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;//用来结束循环 } } }
标签:
原文地址:http://blog.csdn.net/jin_syuct/article/details/46129461