【问题描述】
用100文钱买100只鸡,其中公鸡5文钱1只,母鸡3文钱1只,小鸡1文钱3只。问:公鸡、母鸡和小鸡各买了几只?
【设计思路】
设公鸡、母鸡和小鸡的只数分别为x、y、z,根据题意可得如下方程组:
x + y + z = 100
5x + 3y + z / 3 = 100
如果100文钱全买公鸡,最多可买100 / 5 = 20只,所以x的取值范围在0~20之间;如果100文钱全买母鸡,最多可买100 / 3 =
33只,所以y的取值范围在0~33之间;如果100文钱全买小鸡,最多可买99只,所以z的取值范围在0~99之间,且z % 3 = 0。
通过三重循环穷举x、y和z的值。在穷举的过程中,如果x、y和z满足上面的方程组,则得到一组符合条件的解。
【Swift编程实现】
// 百钱买百鸡
func buyOneHundredChickens1() {
// 通过三重循环穷举x、y和z的值
for x in 0...20 { // 如果100文钱全买公鸡,最多可买100 / 5 = 20只,所以x的取值范围在0~20之间
for y in 0...33 { // 如果100文钱全买母鸡,最多可买100 / 3 =
33只,所以y的取值范围在0~33之间
for z in 0...99 where z % 3 == 0 { //
如果100文钱全买小鸡,最多可买99只,所以z的取值范围在0~99之间,且z % 3 = 0
/*
在穷举的过程中,如果x、y和z满足如下方程组:
x + y + z =
100
5x + 3y + z / 3 = 100
则得到一组符合条件的解
*/
if x + y + z == 100
&& 5 * x + 3 * y + z / 3 == 100 {
print("公鸡:\(x)只,母鸡:\(y)只,小鸡\(z)只")
}
}
}
}
}
buyOneHundredChickens1()
// 百钱买百鸡(程序改进)
func buyOneHundredChickens2() {
//
通过二重循环穷举x、y的值
for x in 0...20 { // 如果100文钱全买公鸡,最多可买100 / 5 =
20只,所以x的取值范围在0~20之间
for y in 0...33 { // 如果100文钱全买母鸡,最多可买100 / 3 =
33只,所以y的取值范围在0~33之间
let z = 100 - x - y
if z >=
0 && z % 3 == 0 && 5 * x + 3 * y + z / 3 == 100
{
print("公鸡:\(x)只,母鸡:\(y)只,小鸡:\(z)只")
}
}
}
}
buyOneHundredChickens2()
【运行结果】
公鸡:0只,母鸡:25只,小鸡:75只
公鸡:4只,母鸡:18只,小鸡:78只
公鸡:8只,母鸡:11只,小鸡:81只
公鸡:12只,母鸡:4只,小鸡:84只