package main
import (
"fmt"
"time"
)
// 百鸡问题是一个数学问题,出自中国古代约5—6世纪成书的《张丘建算经》
// 鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
//翻译成现代汉语: 公鸡五钱一只,母鸡3钱一只,小鸡1钱3只 花费100钱买100只鸡
//翻译成数学语言:
// '从 现代数学 观点来看,实际上是一个求不定方程整数解的问题。解法如下:
// '设公鸡、母鸡、小鸡分别为a、b、c 只,由题意得:
// '①……a+b+c =100
// '②……5a+3b+c/3 =100
func main01() {
循环次数 := 0
for a := 0; a <= 100; a++ {
for b := 0; b <= 100; b++ {
for c := 0; c <= 100; c += 3 {
循环次数 += 1
if a+b+c == 100 && a*5+b*3+c/3 == 100 {
fmt.Printf("公鸡:%d 母鸡:%d 小鸡:%d \n", a, b, c)
}
}
}
}
fmt.Printf("总共循环次数 %d \n", 循环次数)
}
func main02() {
循环次数 := 0
for a := 0; a <= 100/5; a++ {
for b := 0; b <= 100/3; b++ {
循环次数 += 1
c := 100 - a - b
if a*5+b*3+c/3 == 100 && c%3 == 0 {
fmt.Printf("公鸡:%d 母鸡:%d 小鸡:%d \n", a, b, c)
}
}
}
fmt.Printf("总共循环次数 %d \n", 循环次数)
}
func main() {
startTime := time.Now()
main01()
elapsedTime := time.Since(startTime) / time.Millisecond
fmt. Printf ("算法一完成,用时:%d毫秒 \n", elapsedTime)
startTime = time.Now()
main02()
elapsedTime = time.Since(startTime) / time.Millisecond
fmt.Printf("算法二完成,用时:%d毫秒\n", elapsedTime)
}
代码要点:
第24行 for c := 0; c <= 100; c += 3 {
c小鸡必定要求是3的倍数,即0,3,6,所以直接以3步进
第40行c%3 == 0 {
要求c整除3为0,否则可能算出很多不合条件的解
主控main程序中使用time包计时
公鸡:0 母鸡:25 小鸡:75
公鸡:4 母鸡:18 小鸡:78
公鸡:8 母鸡:11 小鸡:81
公鸡:12 母鸡:4 小鸡:84
总共循环次数 346834
算法一完成,用时:1毫秒
公鸡:0 母鸡:25 小鸡:75
公鸡:4 母鸡:18 小鸡:78
公鸡:8 母鸡:11 小鸡:81
公鸡:12 母鸡:4 小鸡:84
总共循环次数 714
算法二完成,用时:0毫秒