贪心算法基础(二)

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




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值