Go语言 百钱百鸡问题

我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

 

解法一:

完全用程序来解,假设先买公鸡,用剩下的钱再买母鸡:

package main

import (
	"fmt"

)

func main() {
	//一只公鸡值五钱  ,一只母鸡值三钱  三只小鸡值一钱  现在要用百钱买百鸡,请问公鸡 母鸡 小鸡各多少只
sum:=0
	for i := 0; i <= 100; i+=5 { //买公鸡的钱只能是5的倍数
	var k int=0
	//小鸡不能超过100只,即公鸡+母鸡共用的钱不能少于67
		if i<=67{
			k=(67-i)/3*3
		}
		for j:=k; j<=100 -i;j+=3  { //买母鸡的钱只能是3的倍数

			iz:=i/5
			jz:=j/3
			//if (100-iz-jz)%3!=0 {//剩下的小鸡只数如果不是3的倍数,则不再继续
			//	continue
			//}
			xz:=(100-i-j)*3
			sum++
			if 100-iz-jz==xz{
				fmt.Println("公鸡:",iz,"只",i,"钱,","母鸡:",jz,"只",j,"钱,",",小鸡:",xz,"只",100-i-j,"钱")

			}
		}
	}
	fmt.Println("循环",sum,"次")
}

控制台输出结果:

公鸡: 0 只 0 钱, 母鸡: 25 只 75 钱, ,小鸡: 75 只 25 钱
公鸡: 4 只 20 钱, 母鸡: 18 只 54 钱, ,小鸡: 78 只 26 钱
公鸡: 8 只 40 钱, 母鸡: 11 只 33 钱, ,小鸡: 81 只 27 钱
公鸡: 12 只 60 钱, 母鸡: 4 只 12 钱, ,小鸡: 84 只 28 钱
循环 208 次

Process finished with exit code 0

 

解法二:

计算出100钱最多买公鸡 20只,母鸡33只,小鸡 300只,在for循环里用只数来进行迭代:

package main

import "fmt"
func main(){
	sum:=0

	for i := 0; i <= 20; i++ {
		for j := 0; j <= 33; j++ {
			x:=100-i-j
			sum++
			if x%3 == 0 && i*5+j*3+x/3 == 100 {
				fmt.Printf("公鸡%d只,母鸡%d只,小鸡%d只\n",i,j,x)
			}
		}
	}
	fmt.Printf("循环%d次",sum)
}

输出结果为:

公鸡0只,母鸡25只,小鸡75只
公鸡4只,母鸡18只,小鸡78只
公鸡8只,母鸡11只,小鸡81只
公鸡12只,母鸡4只,小鸡84只
循环714次
Process finished with exit code 0

 

小结:第一种方法共循环208次,第二种方法共循环714次。第一种方法采用不同的相应步长“5"和“3"实现了按“只数”迭代,再过滤掉了“公鸡+母鸡>100钱”和“小鸡>100只”的循环,因此第一种方法循环次数更少。

以上两种方法都是采用双层循环来完成的,没有方法采用一层循环做到呢?

为了降低时间复杂度,可以对算法进行优化,采用单层循环来完成,

解法三:

公鸡为i,母鸡为j,小鸡为x,据题有算式:

5*i+3*j+k/3=100

i+j+k=100

得到:

j=25-(7*i)/4

x=75+(3*i)/4

 

代码为:

func main(){
sum:=0
	for i := 0; i <20; i++ {  //i 为公鸡
		j:=25-(7*i)/4
		x:= 75 + (3*i)/4
		sum++
		if j>0&&x>0 {
			if x%3 == 0 && 5*i+3*j+x/3 == 100 {
				fmt.Printf("公鸡%d只,母鸡%d只,小鸡%d只\n",i,j,x)
			}
		}
	}
	fmt.Println(sum)
}

运行结果:

公鸡0只,母鸡25只,小鸡75只
公鸡4只,母鸡18只,小鸡78只
公鸡8只,母鸡11只,小鸡81只
公鸡12只,母鸡4只,小鸡84只
20

Process finished with exit code 0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值