课后题求助
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知道我是想要每一个判定条件都成立
谢谢 这段代码找不到答案的原因是因为在循环中的步长增加逻辑有问题。在每次循环中,步长应该是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('在程序限定的范围内找不到答案!')
这样修改后,代码就能正确找到满足条件的阶梯数了。 【问题解答】
原始代码中无法找到满足条件的阶梯数的原因是:循环条件 i < 100 导致在给定的范围内无法找到符合条件的阶梯数。根据题目要求,每种情况下都需要找到最后一步剩余的阶数(即余数),但是 steps 的增长规律导致无法找到符合所有条件的数。
为了找到满足所有条件的阶梯数,我们可以对原始代码进行修改。请参考以下修改后的代码:
steps = 7
FIND = False
while True:
if (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):
FIND = True
break
else:
steps += 7
if FIND:
print('阶梯数是:', steps)
else:
print('在程序限定的范围内找不到答案!')
修改后的代码中使用了一个无限循环 while True,并且通过 steps += 7 每次递增 7 来寻找满足所有条件的阶梯数。这样可以确保找到答案后跳出循环。
关于短路原则的问题,Python 中的布尔逻辑运算符 and 是具有短路特性的。如果使用 and 进行多个条件判断,只要其中一个条件为 False,后面的条件就不会再执行。但是,这个特性并不适用于我们想要找到满足所有条件的阶梯数的情况。所以,在进行多个条件判断时,我们需要同时判断每个条件是否都成立。
希望我的回答能够帮助到你!如果还有其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}
你的代码找不到这个数字的原因是因为你的循环范围太小了。这个数学题的答案是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。 陶远航 发表于 2023-8-17 07:12
你的代码找不到这个数字的原因是因为你的循环范围太小了。这个数学题的答案是119,但是你的代码只循环到99 ...
and运算符短路原则,不是遇到第一个表达式为True也是会退出,不执行后面的and吗 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 我看你的代码没什么问题,找不到?是因为输出的是最后一个else里的内容吗?
上面回复说你的范围有问题,其实你设的范围没太大问题,i是在100以内,但要找的是steps的值,steps=7i,所以范围是在700以内,理论上i=17时,steps=119就会返回,完全能够找到
页:
[1]