从百元百鸡这个简单问题看算法优化

题目 :100元买100只鸡,其中公鸡每只5元,母鸡每只3元,小鸡3只1元,问分别能买几只公鸡,几只母鸡,几只小鸡?请设计一个算法,用计算机计算。

思路:设公鸡数为cock,母鸡数为hen,小鸡数为chick(cock、hen、chick为整数),遍历法解5cock+3hen+chick/3=100,且cock+hen+chick=100的方程。

算法一:这个是最笨的方法,根据cock、hen、chick可能的组合全部遍历,看哪些符合方程条件,运算步骤上万步

#include <stdio.h>
int main()
{
	int cock,hen,chick;//定义变量公鸡,母鸡,小鸡
	for(cock=0;cock<=20;cock++)//公鸡可能的数量遍历 
		for(hen=0;hen<34;hen++)//母鸡可能的数量遍历 
			for(chick=0;chick<100;chick=chick+3)//小鸡可能的数量遍历 
			{
				if((cock+hen+chick==100)&&(cock*5+hen*3+chick/3==100))//符合题2要求后输出 
					printf("公鸡%d只,母鸡%d只,小鸡%d只\n",cock,hen,chick);
			}
	return 0;
}

算法二:我们可以通过Y=100-X-Y这条已知条件,减去一个循环,使算法复杂法降为N的平方,运算步骤减至几百步

#include <stdio.h>
int main()
{
	int cock,hen,chick;//定义变量公鸡,母鸡,小鸡
	for(cock=0;cock<=20;cock++)//公鸡可能的数量遍历 
		for(chick=0;chick<=100-cock;chick=chick+3)//小鸡数是3的倍数且不可能大于100-公鸡数 
		{
			hen=100-cock-chick;//母鸡数是100-公鸡-小鸡数 
			if(cock*5+hen*3+chick/3==100)//符合题2要求后输出 
				printf("公鸡%d只,母鸡%d只,小鸡%d只\n",cock,hen,chick);
		}
	return 0;
}

算法三:设法一个循环解决问题,通过5cock+3hen+chick/3=100得出15cock+9hen+chick=300,再因chick=100-cock-hen,得出15cock+9hen+(100-cock-hen)=300,进而得出14cock+8hen=200再得出7cock+4hen=100(x和y都是整数)。通过先用数学方法的简化,运算步骤减至几十步

#include <stdio.h>
int main()
{
	int cock,hen,chick;//定义变量公鸡,母鸡,小鸡
	for(cock=0;cock<15;cock++)//根据7cock+4hen=100,得出cock小于15 
		if((100-cock*7)%4==0)//此条表示7cock+4hen成立且cock和hen都是整数,符合条件 
		{
			hen=(100-cock*7)/4;
			chick=100-cock-hen;
			printf("公鸡%d只,母鸡%d只,小鸡%d只\n",cock,hen,chick);
		}
	return 0;
}




这个问题是一个经典的数学问题,也被称为“鸡兔同笼”或“孙子问题”,它的背景是一百元钱要买一百只鸡和兔子,已知鸡每只一元,兔子每三元一只,问鸡和兔子各有多少只?这是一个典型的线性方程组问题。 我们可以用以下步骤来编写C语言代码来求解: ```c #include <stdio.h> // 函数声明 int findSolution(int totalMoney, int totalCount, int chickenCost, int rabbitCost); int main() { int money = 100; // 总金额 int count = 100; // 总数量 int chickenCost = 1; // 鸡的成本 int rabbitCost = 3; // 兔子的成本 int chicken = findSolution(money, count, chickenCost, rabbitCost); int rabbits = count - chicken; printf("有 %d 只鸡和 %d 只兔子。\n", chicken, rabbits); return 0; } // 解决函数 int findSolution(int totalMoney, int totalCount, int chickenCost, int rabbitCost) { for (int i = 0; i <= totalCount / 3; i++) { // 遍历可能的兔子数量 int j = totalCount - 3 * i; // 鸡的数量等于总数减去兔子数量的三倍 if (totalMoney == chickenCost * j + rabbitCost * i && j >= 0 && i >= 0) { return j; // 找到合适的鸡数并返回 } } return -1; // 如果没有找到解决方案,返回-1表示无解 } ``` 这个程序会尝试从0到总数量(这里是兔子)除以3的所有可能的兔子数量,计算相应的鸡的数量,并检查是否满足总金额条件。如果找到符合条件的组合,就返回鸡的数量;如果没有,说明没有这样的组合存在,函数返回-1。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值