鱼C论坛

 找回密码
 立即注册
查看: 2490|回复: 4

[已解决]python课后作业疑问

[复制链接]
发表于 2019-11-11 11:44:59 | 显示全部楼层 |阅读模式

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

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

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('在程序限定的范围内找不到答案!')

然后。。。。
不太明白这个代码里的flag从头到尾是做什么用的啊TAT
最佳答案
2019-11-11 12:30:50
本帖最后由 jackz007 于 2019-11-11 12:47 编辑

        为了说明问题方便,先简化一下代码:
x = 7                                                                     # 因为台阶数是 7 的倍数,所以 x 从 7 开始
flag = 0                                                                  # 循环前,置 flag = 0 代表没有找到这个数 
while x <= 707 :                                                          # 循环范围 x 的值与原代码通过 i 所表达的范围一致
    if (x % 2 == 1) and (x % 3 == 2) and (x % 5 == 4) and (x % 6 == 5):
        flag = 1                                                          # 循环中,置 flag = 1 代表已经找到了这个数
        break                                                             # 及时跳出循环,以便把正确的 x 值带出
    x += 7                                                                # 因为 x 是 7 的倍数,所以,每次循环 x 的值加 7

if flag == 1:                                                             # 通过检查 flag 的值判断是否已经找到这个数
    print('阶梯数是:', x)
else:
    print('在程序限定的范围内找不到答案!')

        flag 干什么用?因为,在规定的数值范围内,无论是否能够找到符合所有条件的这个数,循环都会结束,那么,最后,根据什么来判断是否找到了这个数,而且,知道这个数的数值呢?答案就是 flag。
        循环前,先置 flag 的值为 0,代表什么都没有找到,循环中,如果找到了这个数,就修改 flag 的值为 1,并通过 break 语句立即跳出循环;而如果没有找到,循环将进行到底,而 flag 也会最终维持原来的数值 0。这样,循环结束后,通过判断 flag 的数值,很容易就能知道是否已经找到了这个数,和这个数的数值究竟是多少了。

        经过这些分析,不难看出,原代码是错的! 因为,找到这个数的时候,没有及时跳出循环,正确的 x 值在后续循环中被不断覆盖,所以,最后的 x 值一定是循环到底时的 x 值,而不是置 flag = 1 时的那一个。如果不信,可以运行代码试试看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-11 12:30:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-11-11 12:47 编辑

        为了说明问题方便,先简化一下代码:
x = 7                                                                     # 因为台阶数是 7 的倍数,所以 x 从 7 开始
flag = 0                                                                  # 循环前,置 flag = 0 代表没有找到这个数 
while x <= 707 :                                                          # 循环范围 x 的值与原代码通过 i 所表达的范围一致
    if (x % 2 == 1) and (x % 3 == 2) and (x % 5 == 4) and (x % 6 == 5):
        flag = 1                                                          # 循环中,置 flag = 1 代表已经找到了这个数
        break                                                             # 及时跳出循环,以便把正确的 x 值带出
    x += 7                                                                # 因为 x 是 7 的倍数,所以,每次循环 x 的值加 7

if flag == 1:                                                             # 通过检查 flag 的值判断是否已经找到这个数
    print('阶梯数是:', x)
else:
    print('在程序限定的范围内找不到答案!')

        flag 干什么用?因为,在规定的数值范围内,无论是否能够找到符合所有条件的这个数,循环都会结束,那么,最后,根据什么来判断是否找到了这个数,而且,知道这个数的数值呢?答案就是 flag。
        循环前,先置 flag 的值为 0,代表什么都没有找到,循环中,如果找到了这个数,就修改 flag 的值为 1,并通过 break 语句立即跳出循环;而如果没有找到,循环将进行到底,而 flag 也会最终维持原来的数值 0。这样,循环结束后,通过判断 flag 的数值,很容易就能知道是否已经找到了这个数,和这个数的数值究竟是多少了。

        经过这些分析,不难看出,原代码是错的! 因为,找到这个数的时候,没有及时跳出循环,正确的 x 值在后续循环中被不断覆盖,所以,最后的 x 值一定是循环到底时的 x 值,而不是置 flag = 1 时的那一个。如果不信,可以运行代码试试看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-11-11 14:08:53 | 显示全部楼层
初学者等待某宝客服上线,无聊在乱逛,看到这个想自己试做一下,发现问题借贴求助.
以下是我自己试着做的内容:
####爱因斯坦曾出过这样一道有趣的数学题:
####有一个长阶梯,若每步上2阶,最后剩1阶;
#####若每步上3阶,最后剩2阶;
#####若每步上5阶,最后剩4阶;
#####若每步上6阶,最后剩5阶;
#####只有每步上7阶,最后刚好一阶也不剩。
#####是要求台阶数量吗??
x=7
i = 0
while i < 100:
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6 == 5):
        print(x)
    else:
        i += 1
        x += 7
print("计算结束")

运行后无限循环输出答案,自己试着心算几个循环,没发现问题点,还请路过大神帮助.谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-11 14:18:58 | 显示全部楼层
warbringer 发表于 2019-11-11 14:08
初学者等待某宝客服上线,无聊在乱逛,看到这个想自己试做一下,发现问题借贴求助.
以下是我自己试着做的内容 ...

我自己的解法是在12 13行加入break,运行起来看起来就正常了.


自己在回自己的贴...原来是程序永远停在i=17
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-11 15:05:39 From FishC Mobile | 显示全部楼层
我认为,源代码没错吧。x的值在后续并不会被覆盖。后续其实是不断给flag赋值1,直到退出循环。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
Abigail + 5 + 5 + 3

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 18:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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