【例4.23】
百钱买百鸡问题。鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、鸡母、鸡雏各有几何?
-
方法一:
在数学中解决这个问题,我们通常会列一个方程组,设鸡翁x,鸡母y,鸡雏z,则有
- x+y+z=100
- 5*x+3*y+z/3=100
- 同时满足上述方程的x,y,z的解就是所求。
- 根据这个思想,问题就转化为了求方程组的解,我们列举x,y,z的所有肯能,然后判断这些可能是否能够时得方程组成立,能使方程组成立的就是真正的解。
- 在进一步分析可得,x的取值范围为:0~100/5,x的取值范围为:0~100/3,z的取值范围为0~100
程序如下:
#include<iostream>
using namespace std;
int main() {
int x, y, z;
for (x = 0; x <= 100; x++) {
for (y = 0; y <= 100; y++) {
for (z = 0; z <= 100; z++) {
if (x + y + z == 100 && 5 * x + 3 * y + z / 3 == 100) {
cout << x << " " << y << " " << z << endl;
}
}
}
}
return 0;
}
-
思考:
这里用了三层循环来解决问题,当x取得一个数值时,y的循环体需要遍历y的所有取值,对于y的每一个取值,z的循环体也要遍历z的所有取值,对于z的每一个取值,if语句都要执行一次
,因此不难算出,在程序的执行过程中,作为内层循环体的if语句需要被执行的次数大概为:。
- (100/5)*(100/3)*100
- 这个次数大概为6万次,那我们有没有其他方法能够减少程序执行的次数,提高效率呢?
-
方法二:
鸡翁,鸡母,鸡雏共100只,一旦确定了鸡翁的数量x和鸡母的数量y,鸡雏的数量也就确定了:(100-x-y)
- 因此我们可以尝试写出两层循环的程序
程序如下:
#include<iostream>
using namespace std;
int main() {
int x, y, z;
for (x = 0; x <= 100/5; x++) {
for (y = 0; y <= 100/3; y++) {
z = 100 - x - y;
if (x + y + z == 100 && 5 * x + 3 * y + z/3 == 100) {
cout << x << " " << y << " " << z << endl;
}
}
}
return 0;
}
-
说明:
对于与本题类似的求解不定方程问题,都可以用循环来解,为了提高效率,可以在程序中进行优化,减少循环体的执行次数。