百钱百鸡问题(C)

题目链接:https://www.bilibili.com/video/av21356335

问题描述:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问能够买公鸡、母鸡、小鸡各多少只?

首先根据问题列出解体方程组:

其中公鸡最多20只,母鸡最多33只,小鸡最多100只

#include <stdio.h>

int main(void)
{
	int cock, hen, chicken;  //公鸡、母鸡、小鸡

	for (cock = 0; cock <= 20; cock++)
	{
		for (hen = 0; hen <= 33; hen++)
		{
			for (chicken = 0; chicken <= 100; chicken++)
			{
				if (((cock * 5 + hen * 3 + chicken) == 100) && ((cock + hen + 3 * chicken) == 100))
				{
						printf("公鸡%d只,母鸡%d只,小鸡%d只!\n", cock, hen, 3 * chicken);
				}
			}
		}
	}
}

问题是一个经典的问题,可通过穷举法来解决。以下是几种不同实现方式的C语言代码: #### 实现方式一 ```c #include <stdio.h> void main(){ int a,b,c; printf("\t公鸡\t母鸡\t小鸡\n"); for(a = 0; a <= 20; a++) for(b = 0; b <= 33; b++) { c = 100 - a - b; if((c % 3 == 0) && (5 * a + 3 * b + c / 3 == 100)) printf("\t %d\t %d\t %d\n", a, b, c); } } ``` 这种方式通过两层循环遍历公鸡母鸡可能的量,然后计算出小鸡量,再判断是否满足条件[^1]。 #### 实现方式二 ```c #include <stdio.h> void main(void){ int x,y,z; for(x = 1; x <= 20; x++){ for(y = 1; y <= 33; y++){ z = 100 - x - y; if((z % 3 == 0) && (5 * x + 3 * y + z / 3 == 100)){ printf("cook=%d,hen=%d,chiken=%d\n", x, y, z); } } } } ``` 此方式同样是使用两层循环,只是变量名有所不同,并且输出格式也不一样[^2]。 #### 实现方式三 ```c #include <stdio.h> int main() { int x,y,z; for(x = 0; x <= 20; x++)//公鸡不会超过20只 for(y = 0; y <= 34; y++)//母鸡不会超过34只 for(z = 0; z <= 100; z++)//小鸡不会超过100只 if((x + y + z) == 100 && (5 * x + 3 * y + z / 3) == 100 && z % 3 == 0)//同时要满足z是3的整 printf("cock=%d,hen=%d,chicken=%d\n", x, y, z); return 0; } ``` 这种实现使用了三层循环,分别遍历公鸡母鸡小鸡可能的量,再进行条件判断[^3]。 #### 实现方式四 ```c #include <stdio.h> int main(){ // int cock,hen,chicken; for(hen = 0; hen <= 33; hen++) for(chicken = 0; chicken <= 300; chicken += 3){ cock = 100 - chicken - hen; if(cock + hen + chicken == 100 && 5 * cock + 3 * hen + chicken / 3 == 100 && cock >= 0) printf("公鸡母鸡小鸡对应的解为(%d,%d,%d)\n", cock, hen, chicken); } return 0; } ``` 该方式通过两层循环遍历母鸡小鸡可能的量,计算出公鸡量,然后判断是否满足条件,并且要求公鸡量不能为负[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值