鱼C论坛

 找回密码
 立即注册
查看: 709|回复: 5

[已解决]python第六讲课后题疑问

[复制链接]
发表于 2020-5-4 23:57:39 | 显示全部楼层 |阅读模式

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

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

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

while i <= 100:
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
        flag = 1
    else:
        x = 7 * (i+1) # 根据题意,x一定是7的整数倍,所以每次乘以7
    i += 1
if flag == 1:
    print('阶梯数是:', x)
else:
    print('在程序限定的范围内找不到答案!')

疑问:为什么结果输出是x=119 而不是x=700,但是i=707?
谢谢!
最佳答案
2020-5-5 01:45:38
关键看这一段,每次循环的时候,当x不符合上面的条件,就会运行else的语句,就是把x在原有值上加7然后到下次循环再来验证,当发现了第一个相符的数119后,就会执行flag=1这一句,而else的语句就不会被执行了,x值就固定在119了,虽然每次循环i都会加1,但是x值不变了,只会再次执行flag=1,一直到最后i值大于100了退出循环,这时i=101,但是x值仍然是119,所以不会有700的值出现。
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):  #在i=17之前,x不符合条件,所以执行else增加x值,17后,x=119,每次循环都会符合条件
        flag = 1
    else:                              #i小于17之前一直执行这一句,最终x=7*17=119后,由于119符合上面的条件,所以else将不再执行
        x = 7 * (i+1)
标答既繁琐不易理解,而且浪费效率,找出答案后还要执行无谓的循环,不如改成这样:
x = 7
i = 1
while True:
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
        break
    x = 7 * (i+1)
    i += 1
print('阶梯数是:', x)
或者用for循环更高效:
for x in range(7,int(input('请输入需要查找阶梯数的范围:')),7):
    print('%d\n' % x if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5) else '', end='')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-5 00:35:17 | 显示全部楼层
这个程序运行,得到的结果是i = 101,并不是707,同时,因为对于这个程序,当x符合条件时while循环并不会结束,只有循环到i > 100时,循环会结束,进而执行下面语句。
因此,i = 101。并且因为此时,存在x符合条件,所以,flag = 1,进而在下面打印出了阶梯数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 01:45:38 | 显示全部楼层    本楼为最佳答案   
关键看这一段,每次循环的时候,当x不符合上面的条件,就会运行else的语句,就是把x在原有值上加7然后到下次循环再来验证,当发现了第一个相符的数119后,就会执行flag=1这一句,而else的语句就不会被执行了,x值就固定在119了,虽然每次循环i都会加1,但是x值不变了,只会再次执行flag=1,一直到最后i值大于100了退出循环,这时i=101,但是x值仍然是119,所以不会有700的值出现。
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):  #在i=17之前,x不符合条件,所以执行else增加x值,17后,x=119,每次循环都会符合条件
        flag = 1
    else:                              #i小于17之前一直执行这一句,最终x=7*17=119后,由于119符合上面的条件,所以else将不再执行
        x = 7 * (i+1)
标答既繁琐不易理解,而且浪费效率,找出答案后还要执行无谓的循环,不如改成这样:
x = 7
i = 1
while True:
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
        break
    x = 7 * (i+1)
    i += 1
print('阶梯数是:', x)
或者用for循环更高效:
for x in range(7,int(input('请输入需要查找阶梯数的范围:')),7):
    print('%d\n' % x if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5) else '', end='')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 10:00:14 | 显示全部楼层
小泉app 发表于 2020-5-5 00:35
这个程序运行,得到的结果是i = 101,并不是707,同时,因为对于这个程序,当x符合条件时while循环并不会结 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 10:02:00 | 显示全部楼层
txxcat 发表于 2020-5-5 01:45
关键看这一段,每次循环的时候,当x不符合上面的条件,就会运行else的语句,就是把x在原有值上加7然后到下 ...

懂了懂了!十分感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 11:33:03 | 显示全部楼层
octopus02 发表于 2020-5-5 10:02
懂了懂了!十分感谢!

如果问题解决,请设【最佳答案】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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