算法学习日记5:鸡兔蛇同笼问题

鸡兔蛇同笼,已知有35个头,94只脚,求鸡兔蛇各几只,是经典数学问题鸡兔同笼的扩展。

鸡有两只脚,兔子四只脚,蛇有零只脚。

可以先抽象成数学式:

x+y+z=35

2x+4y=94

这会给我们优化算法带来帮助。

首先通过常规的循环迭代进行求解:

#include <stdio.h>
//鸡兔蛇同笼问题,35个头,94只脚
int main(void){
	int x,y,z;
//	x鸡,y兔,z蛇
	for(x = 0;x <= 35;x++)
		for(y = 0;y <= 35;y++)
			for(z = 0;z <= 35;z++) 
				if(x+y+z == 35 && x*2 + y*4 == 94)
					printf("鸡%d只,兔%d只,蛇%d只\n",x,y,z);
	return 0;
} 

输出结果:

鸡1只,兔23只,蛇11只
鸡3只,兔22只,蛇10只
鸡5只,兔21只,蛇9只
鸡7只,兔20只,蛇8只
鸡9只,兔19只,蛇7只
鸡11只,兔18只,蛇6只
鸡13只,兔17只,蛇5只
鸡15只,兔16只,蛇4只
鸡17只,兔15只,蛇3只
鸡19只,兔14只,蛇2只
鸡21只,兔13只,蛇1只
鸡23只,兔12只,蛇0只

因为有三个for循环导致时间复杂度较高,无法进行大规模的运算。

根据数学公式,我们可以得到以下计算式:

x+2y=47

因为解y会进行浮点运算,为了避免误差,我们选择先计算x。

x=47-2y

x,y转化完成后可得出z最终结果z=35-x-y

此时没有了循环的约束条件,if语句中要加入x,y,z>=0的判断语句输出结果。

优化算法:

#include <stdio.h>
//鸡兔蛇同笼问题,35个头,94只脚,优化算法 
int main(void){
	int x,y,z;
//	x鸡,y兔,z蛇
	for(y = 0;y <= 35;y++){
		x = 47 - 2 * y;
		z = 35 - x - y;
		if(x+y+z == 35 && x*2 + y*4 == 94 && x>=0 && y>=0 && z >= 0)
			printf("鸡%d只,兔%d只,蛇%d只\n",x,y,z);
	}
	return 0;
} 

输出结果:

鸡23只,兔12只,蛇0只
鸡21只,兔13只,蛇1只
鸡19只,兔14只,蛇2只
鸡17只,兔15只,蛇3只
鸡15只,兔16只,蛇4只
鸡13只,兔17只,蛇5只
鸡11只,兔18只,蛇6只
鸡9只,兔19只,蛇7只
鸡7只,兔20只,蛇8只
鸡5只,兔21只,蛇9只
鸡3只,兔22只,蛇10只
鸡1只,兔23只,蛇11只

因以y起始,所以输出顺序发生了变化,最终结果不变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值