百年百鸡php_PHP百钱百鸡问题(考考你的逻辑能力)

本文介绍了如何使用PHP编程解决中国古代数学问题‘百钱百鸡’,即公鸡5元,母鸡3元,小鸡1元3只,100元买100只鸡的组合问题。通过穷举法、优化循环条件等方式减少计算量,展示了三种不同的PHP实现方案,强调了优化循环和提高代码效率的重要性。
摘要由CSDN通过智能技术生成

php中文网最新课程

每日17点准时技术干货分享

e6e3f5375bb2cdb9732abc1b5d09d2fb.png

什么是百钱百鸡?

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

翻译过来就是:

公鸡5元一只,母鸡3元一只,小鸡1元3只,100元买了100只鸡,问各多少只?

下面利用PHP分三种方法来解决这个问题:

第一种

假设:

如果公鸡1只,母鸡1只,小鸡1只,则总价为:......,不对。

如果公鸡1只,母鸡1只,小鸡2只,则总价为:......,不对。

如果公鸡1只,母鸡1只,小鸡3只,则总价为:......,不对。

...........................

如果公鸡1只,母鸡2只,小鸡1只,则总价为:......,不对。

如果公鸡1只,母鸡2只,小鸡2只,则总价为:......,不对。

如果公鸡1只,母鸡2只,小鸡3只,则总价为:......,不对。

.............................

如果公鸡100只,母鸡100只,小鸡100只,则总价为:......,不对。

这种编程思想叫做“穷举”,就是将所有可能的答案都罗列出来,然后挨个去验证。

代码如下:

<?php $count = 0;for($gongji = 0;$gongji <= 100;$gongji++){for ($muji=0; $muji <= 100; $muji++) {for ($xiaoji=0; $xiaoji <= 100 ; $xiaoji++) {if($gongji + $muji + $xiaoji ==100 && $gongji*5 +$muji*3 + $xiaoji / 3 == 100){echo "
公鸡:$gongji,母鸡: $muji,小鸡: $xiaoji";}$count++;}}}echo "
".$count;

结果:

公鸡:0,母鸡: 25,小鸡: 75公鸡:4,母鸡: 18,小鸡: 78公鸡:8,母鸡: 11,小鸡: 81公鸡:12,母鸡: 4,小鸡: 841030301

第二种

代码如下

$count = 0;for($gongji = 0;$gongji <= 100 / 5;$gongji++){for ($muji=0; $muji <= 100 / 3; $muji++) {$xiaoji = 100 - $gongji - $muji;if($gongji*5 + $muji*3 +$xiaoji / 3 == 100){echo "
公鸡:$gongji,母鸡: $muji,小鸡: $xiaoji";}$count++;}}echo "
".$count;

结果:

公鸡:0,母鸡: 25,小鸡: 75公鸡:4,母鸡: 18,小鸡: 78公鸡:8,母鸡: 11,小鸡: 81公鸡:12,母鸡: 4,小鸡: 84714

第三种

代码如下

$count = 0;for($gongji = 0;$gongji <= 100 / 5;$gongji++){for ($muji=0; $muji <= (100-$gongji*5) / 3; $muji++) {$xiaoji = 100 - $gongji - $muji;if($gongji*5 + $muji*3 +$xiaoji / 3 == 100){echo "
公鸡:$gongji,母鸡: $muji,小鸡: $xiaoji";}$count++;}}echo "
".$count;

结果:

公鸡:0,母鸡: 25,小鸡: 75公鸡:4,母鸡: 18,小鸡: 78公鸡:8,母鸡: 11,小鸡: 81公鸡:12,母鸡: 4,小鸡: 84364

总结:

直接用三重for循环是很容易想到的,但是三重循环的复杂度太大了,所以应该想到减少循环。直接把小鸡用总的鸡数减去公鸡和母鸡,就能减少一层循环,这样就能减少运行的时间,提高代码效率。

【相关推荐】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值