码迷,mamicode.com
首页 > 编程语言 > 详细

贪心算法基础(二)

时间:2015-05-29 00:57:07      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

今天我们还是讲贪心算法。题目是:将一个真分数表示成若干个埃及分数的和。啥是埃及分数?例如: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!