Python每日一练——第4天:百钱百鸡问题(升级版)

Posted 袁袁袁袁满

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python每日一练——第4天:百钱百鸡问题(升级版)相关的知识,希望对你有一定的参考价值。

前言📢📢

Python每日一练来啦,本文已收录于:《Python每日一练》专栏

此专栏目的在于,帮忙学习Python的小白提高编程能力,训练逻辑思维,每周持续更新中,欢迎免费订阅!!!


文章目录


1. 问题描述

我国古代数学家张丘建在《算经》一书中曾提出过著名的 “百钱买百鸡” 问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?

百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡每只5元,母鸡每只3元,小鸡3只一元,现要求用100元钱买100只鸡(三种类型的鸡都要买),问公鸡、母鸡、小鸡各买几只?

小伙伴们看了问题描述后,一定要自己先练习,再去看博主的代码和解题思路,才能提高自己的编程水平,全靠自觉哟!!!

欢迎小伙伴们把自己的思路或答案在评论区留言,博主会选一个最优解答进行置顶。

2. 问题分析

数学解法:设公鸡买了x只,母鸡买了y只,小鸡买了z只

数量关系式: x + y + z = 100

钱的关系式:5x + 3y + z/3 = 100

3. 算法思路

1.以公鸡为突破点,公鸡5元一只,100元最多只能买20只,由于三种鸡都要买,所以公鸡数一定是小于20的。


2.母鸡每只3元,100全 拿来买母鸡,最多也不能超过33只机会。


3.设公鸡数为x,母鸡数为y,小鸡z只


4.只要满足 5x+3y+ z/3== 100 和 x + y + z == 100 就可以输出此种组合的结果。

4. 代码实现

实现代码📝:

import time

# 开始时间
start = time.time()
# 外层循环控制公鸡数量取值范围:0~20
for x in range(0, 21):
    # 内层循环控制母鸡数量取值范围:0~33
    for y in range(0, 34):
        # 嵌套内层循环控制小鸡数量取值范围:0~100
        for z in range(0, 101):
            # 条件判断同时满足 5x+3y+ z/3== 100 和 x + y + z == 100
            if (x * 5 + y * 3 + z / 3 == 100) and (x + y + z == 100):
                print("公鸡有%d只\\t母鸡有%d只\\t小鸡有%d只" % (x, y, z))
# 结束时间
end = time.time()
print("算法总耗时:", end - start)

运行结果👇:

思考:虽然能求出结果,但仔细一想,用了三重循环, 总的循环次数:21 ∗ 34 ∗ 101 = 72114 次,太耗时间了,能不能有一种更好的解决方法呢?

5. 算法升级

思路:买了一只公鸡,花掉5钱,还剩下100 - 5 = 95 钱,买母鸡和小鸡的钱只有95钱,而不是100钱。再买一只母鸡,还剩下100- 5 - 3 = 92钱,那么买小鸡的钱只有92钱……所以每重循坏次数不再是固定的100,而是变化的。


第一重循环(公鸡):100 / 5 = 20 次


第二重循环(母鸡):(100 - x) / 3次


第三重判断(小鸡):100 - x - y次

实现代码📝:

import time

# 开始时间
start = time.time()
for x in range(0, 101, 5):  # 公鸡
    for y in range(3, 101 - x, 3):  # 母鸡
        z = 100 - x - y  # 小鸡
        if (x // 5 + y // 3 + z * 3 == 100) and (x + y + z == 100):
            print("公鸡有%d只\\t母鸡有%d只\\t小鸡有%d只" % (x // 5, y // 3, z * 3))
# 结束时间
end = time.time()
print("算法总耗时:", end - start)

运行结果👇:

总结:方式2较方式1提升了100倍,这个小小的程序可以说明算法的重要性,用不同的算法,时间复杂度是不一样的。在实现一个功能的基础上,还要兼顾效率的问题。当然这个题目还可以用求不定方程整数解的办法来解决,这个算法用时会更短。


《100天精通Python从入门到就业》专栏推荐白嫖80G学习大礼包

《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)!
  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等

免费资料获取,更多粉丝福利,关注下方公众号获取

python——百钱百鸡题


例子:有100文钱,要买100只鸡,公鸡5文一只,母鸡3文一只,小鸡三只一文,问公鸡母鸡小鸡各多少只?

方法一:
1
#!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 for a in range(100//5+1): 4 for b in range(100//3+1): 5 for c in range(0, 100*3+1, 3): 6 if a + b + c ==100 7 and a*5 + b*3 + (c//3)*1 == 100: 8 print(GJ:%3d MJ:%3d XJ:%3d %(a, b, c))

执行结果:
GJ:  0 MJ: 25 XJ: 75
GJ:  4 MJ: 18 XJ: 78
GJ:  8 MJ: 11 XJ: 81
GJ: 12 MJ:  4 XJ: 84


方法二:
1
#!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # x + y + z = 100 4 # 5x + 3y + z/3 = 100 5 for x in range(1, 20): 6 for y in range(1, 33): 7 z = 100 - y - x 8 if z % 3 == 0 and 5 * x + 3 * y + z / 3 == 100: 9 print(公鸡:, x, , 母鸡:, y, , 小鸡:, z, )

执行结果:
公鸡: 4 只 母鸡: 18 只 小鸡: 78 只
公鸡: 8 只 母鸡: 11 只 小鸡: 81 只
公鸡: 12 只 母鸡: 4 只 小鸡: 84 只

 



















以上是关于Python每日一练——第4天:百钱百鸡问题(升级版)的主要内容,如果未能解决你的问题,请参考以下文章

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

python——百钱百鸡题

PHP/Python---百钱百鸡简单实现及优化

百钱百鸡算法优化

C语言程序设计百钱买百鸡(百钱百鸡,百鸡问题)!

085.百钱百鸡问题