鱼C论坛

 找回密码
 立即注册
查看: 952|回复: 2

[已解决]爱因斯坦的台阶问题

[复制链接]
发表于 2018-8-5 22:17:08 | 显示全部楼层 |阅读模式

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

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

x
我的思路是在每一种台阶走法逐步在列表中把不符合条件的数剔除,最后得出的列表即为答案。
#爱因斯坦曾出过这样一道有趣的数学题:
#有一个长阶梯,若每步上2阶,最后剩1阶;
#若每步上3阶,最后剩2阶;若每步上5阶,最后剩4阶;
#若每步上6阶,最后剩5阶;
#只有每步上7阶,最后刚好一阶也不剩。
i = 1
First = []
while i <= 100:
    First.append(i)
    i += 1
    while i % 2 != 1:
        i += 1
#结果正确
for f in First:
    if f % 3 != 2:
        First.remove(f)
for f in First:
    if f % 5 != 4:
        First.remove(f)
for f in First:
    if f % 6 != 5:
        First.remove(f)
for f in First:
    if f % 7 != 0:
        First.remove(f)
#结果错误
print(First)
猜想是for用错了,但又不知道为什么错,希望得到大佬教导。
最佳答案
2018-8-6 01:07:29

  1. First = [i for i in range(0,7*30,7)]         #既然已经知道是 7 的倍数,直接造一个 7 的倍数的数列就好
  2. flag = 0                #小旗子
  3. for f in First:
  4.     if (f%2 == 1)&(f%3 ==2)&(f%5==4)&(f%6==5):
  5.         flag += 1            #或者 flag = 1
  6.         print('Found a solution --->',f)
  7. if flag == 0:                #找不到就举旗
  8.     print('Number not found within range')
复制代码

还有比较有效率的方法。但是对初学者不直觉。

for 循环不是不能执行删除操作,而是如果执行,会出错。原因如下:
for 循环是 while 循环的包装。如果我们用 while 循环来写 for 循环的功能,那么我们会让指针 i = 0 开始跑。每跑一次,i+=1。假设你现在删除第 5 个元素,那么第 6 个元素以及后面的元素将往前移一格。现在第 5 个元素将会是原先的第 6 个元素。然后,程序执行 i+=1,指针指向第 6 个元素,但第 6 个元素是原先的第 7 个元素。所以原本在数组中的第 6 个元素被忽略了。因此,我们可以看到,你没删除一次,就会自动忽略一个元素的审查。

如果要按你原本的想法,那么你每做一次 for 循环,就要制造一个新的数组,把符合条件的数给留下
  1. a = []
  2. for f in First:
  3.     if f % 3 == 2:  #变成把符合的留下
  4.         a.append(f)
复制代码


有想法是好的,先把你的想法给实现,你会学得更多~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-8-5 22:28:31 From FishC Mobile | 显示全部楼层
for循环的列表不能执行删除操作的,你这个方法有点繁琐,如实在想求证你这个方法,你复制一个列表出来进行删除操作吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 01:07:29 | 显示全部楼层    本楼为最佳答案   

  1. First = [i for i in range(0,7*30,7)]         #既然已经知道是 7 的倍数,直接造一个 7 的倍数的数列就好
  2. flag = 0                #小旗子
  3. for f in First:
  4.     if (f%2 == 1)&(f%3 ==2)&(f%5==4)&(f%6==5):
  5.         flag += 1            #或者 flag = 1
  6.         print('Found a solution --->',f)
  7. if flag == 0:                #找不到就举旗
  8.     print('Number not found within range')
复制代码

还有比较有效率的方法。但是对初学者不直觉。

for 循环不是不能执行删除操作,而是如果执行,会出错。原因如下:
for 循环是 while 循环的包装。如果我们用 while 循环来写 for 循环的功能,那么我们会让指针 i = 0 开始跑。每跑一次,i+=1。假设你现在删除第 5 个元素,那么第 6 个元素以及后面的元素将往前移一格。现在第 5 个元素将会是原先的第 6 个元素。然后,程序执行 i+=1,指针指向第 6 个元素,但第 6 个元素是原先的第 7 个元素。所以原本在数组中的第 6 个元素被忽略了。因此,我们可以看到,你没删除一次,就会自动忽略一个元素的审查。

如果要按你原本的想法,那么你每做一次 for 循环,就要制造一个新的数组,把符合条件的数给留下
  1. a = []
  2. for f in First:
  3.     if f % 3 == 2:  #变成把符合的留下
  4.         a.append(f)
复制代码


有想法是好的,先把你的想法给实现,你会学得更多~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-10 06:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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