鱼C论坛

 找回密码
 立即注册
查看: 1559|回复: 6

[已解决]课后题求助

[复制链接]
发表于 2023-8-16 23:08:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
0. 爱因斯坦曾出过这样一道有趣的数学题:
有一个长阶梯,若每步上 2 阶,最后剩 1 阶;若每步上 3 阶,最后剩 2 阶;若每步上 5 阶,最后剩 4 阶;若每步上 6 阶,最后剩 5 阶;只有每步上 7 阶,最后刚好一阶也不剩。

steps = 7
i = 1
FIND = False

while i < 100:
    # 由于测试的都是7的倍数
    # 因此只要同时满足除以2余1、除以3余2、除以5余4、除以6余5,就是最终的结果
    if (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):
        FIND = True
        break
    else:
        steps = 7 * (i + 1)
    i = i + 1

if FIND == True:
    print('阶梯数是:', steps)
else:
    print('在程序限定的范围内找不到答案!')

代码为什么找不了这个数字
另外(steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5)不是有短路原则吗,怎么能让Python知道我是想要每一个判定条件都成立
谢谢
最佳答案
2023-8-17 07:12:27
你的代码找不到这个数字的原因是因为你的循环范围太小了。这个数学题的答案是119,但是你的代码只循环到99,所以无法找到满足条件的阶梯数。你可以把你的循环条件改成 i < 1000,这样就可以找到答案了。

另外,(steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5)这个表达式中的and运算符是逻辑运算符,它用来连接两个或多个布尔表达式,返回一个布尔值。and运算符有短路原则,也就是说如果左边的表达式为False,那么就不会计算右边的表达式,直接返回False。但是如果左边的表达式为True,那么就会继续计算右边的表达式,直到遇到False或者所有表达式都计算完毕。所以,如果你想要每一个判定条件都成立,那么就需要用and运算符把它们连接起来,这样只有当所有条件都为True时,整个表达式才会返回True。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-16 23:09:22 | 显示全部楼层
这段代码找不到答案的原因是因为在循环中的步长增加逻辑有问题。在每次循环中,步长应该是7的倍数,但是代码中的步长增加逻辑是错误的。

另外,对于逻辑运算符 and ,它具有短路原则。当使用 and 连接多个条件时,如果其中一个条件为 False ,则后面的条件将不再进行判断,因为整个表达式已经为 False 。但是,如果你想要每一个判定条件都成立,可以使用 & 运算符代替 and 运算符。

下面是修改后的代码:
steps = 7
i = 1
FIND = False

while i < 100:
    if (steps % 2 == 1) & (steps % 3 == 2) & (steps % 5 == 4) & (steps % 6 == 5):
        FIND = True
        break
    else:
        steps = 7 * (i + 1)
    i = i + 1

if FIND == True:
    print('阶梯数是:', steps)
else:
    print('在程序限定的范围内找不到答案!')

这样修改后,代码就能正确找到满足条件的阶梯数了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-16 23:09:39 | 显示全部楼层
【问题解答】

原始代码中无法找到满足条件的阶梯数的原因是:循环条件 i < 100 导致在给定的范围内无法找到符合条件的阶梯数。根据题目要求,每种情况下都需要找到最后一步剩余的阶数(即余数),但是 steps 的增长规律导致无法找到符合所有条件的数。

为了找到满足所有条件的阶梯数,我们可以对原始代码进行修改。请参考以下修改后的代码:
steps = 7FIND = Falsewhile True:    if (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):        FIND = True        break    else:        steps += 7if FIND:    print('阶梯数是:', steps)else:    print('在程序限定的范围内找不到答案!')
修改后的代码中使用了一个无限循环 while True,并且通过 steps += 7 每次递增 7 来寻找满足所有条件的阶梯数。这样可以确保找到答案后跳出循环。

关于短路原则的问题,Python 中的布尔逻辑运算符 and 是具有短路特性的。如果使用 and 进行多个条件判断,只要其中一个条件为 False,后面的条件就不会再执行。但是,这个特性并不适用于我们想要找到满足所有条件的阶梯数的情况。所以,在进行多个条件判断时,我们需要同时判断每个条件是否都成立。

希望我的回答能够帮助到你!如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-17 07:12:27 | 显示全部楼层    本楼为最佳答案   
你的代码找不到这个数字的原因是因为你的循环范围太小了。这个数学题的答案是119,但是你的代码只循环到99,所以无法找到满足条件的阶梯数。你可以把你的循环条件改成 i < 1000,这样就可以找到答案了。

另外,(steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5)这个表达式中的and运算符是逻辑运算符,它用来连接两个或多个布尔表达式,返回一个布尔值。and运算符有短路原则,也就是说如果左边的表达式为False,那么就不会计算右边的表达式,直接返回False。但是如果左边的表达式为True,那么就会继续计算右边的表达式,直到遇到False或者所有表达式都计算完毕。所以,如果你想要每一个判定条件都成立,那么就需要用and运算符把它们连接起来,这样只有当所有条件都为True时,整个表达式才会返回True。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-17 07:36:12 | 显示全部楼层
陶远航 发表于 2023-8-17 07:12
你的代码找不到这个数字的原因是因为你的循环范围太小了。这个数学题的答案是119,但是你的代码只循环到99 ...

and运算符短路原则,不是遇到第一个表达式为True也是会退出,不执行后面的and吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-17 07:39:54 | 显示全部楼层
percy213 发表于 2023-8-17 07:36
and运算符短路原则,不是遇到第一个表达式为True也是会退出,不执行后面的and吗


and连接的所有表达式都为True才会返回True。只要有一个不成立,就会返回False。
or连接的所有表达式只要有一个成立就会返回True,都不成立就会返回False

你可能把and和or搞混了,可以复习一下
->https://www.bilibili.com/video/BV1c4411e77t?p=12
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-17 09:24:21 | 显示全部楼层
我看你的代码没什么问题,找不到?是因为输出的是最后一个else里的内容吗?
上面回复说你的范围有问题,其实你设的范围没太大问题,i是在100以内,但要找的是steps的值,steps=7i,所以范围是在700以内,理论上i=17时,steps=119就会返回,完全能够找到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 19:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表