一、问题描述
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”: -只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
二、思路:
1、这道题可以分别设公鸡为x,母鸡为y,小鸡为z,然后找关系列出三元一次方程组。为
(1):x+y+z=100;
(2):5x+3y+z/3=100;
2、对于不定方程足组,我们可以利用暴力枚举来找出解决方案。对于x,x的范围是0~20。对于y,y的范围是0~33,但由于y收到x的影响,实则不会循环到33.
对于z,由于最多只能买100只,z的最大范围是0~100。所以可以利用三层循环暴力枚举除结果。
三、代码实现
(1):三层暴力循环:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> using namespace std; int main() { int x, y, z; for (x = 0; x <= 20; x++) { for (y = 0; y <= 33; y++) { for (z = 0; z <= 100; z++) { if (x + y + z == 100 && 5 * x + 3 * y + z / 3.0 == 100) { cout << x << " " << y << " " << z << endl; } } } } return 0; }View Code 结果:
![](/i/l/?n=23&i=blog/3169115/202304/3169115-20230412124800149-384048964.png)
(2):优化
因为买的鸡的总数是一定的,所以对于z可以用x,y来表示:z=100-x-y;
所以可以优化掉一层循环,最总变为两层循环。
优化后代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> using namespace std; int main() { int x, y, z; for (x = 0; x <= 20; x++) { for (y = 0; y <= 33; y++) { z = 100 - x - y; if (5 * x + 3 * y + z / 3.0 == 100) { cout << x << " " << y << " " << z << endl; } } } return 0; }View Code 结果:
![](/i/l/?n=23&i=blog/3169115/202304/3169115-20230412124812350-1330635133.png)
标签:int,百钱,小鸡,问题,循环,百鸡,100 From: https://www.cnblogs.com/zk126/p/17309436.html