dandd31 发表于 2014-3-5 00:18:13

python第6课 “爱因斯坦阶梯”问题的疑问

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



我看了好几遍也看不懂小甲鱼老师的答案,弱弱的问下我的这个解决方式是否有效?{:7_163:}


i = 1                   #做为起始数#
while i < 10000:
        if (i%2 == 1 and i%3 == 2 and i%5 == 4 and i%6 == 5 and i%7 == 0) == True :
                print (i)
        i += 1

福禄娃娃 发表于 2014-3-5 00:18:14

你的做法也是对的,算出了从1到10000之间符合条件的数
小甲鱼老师的代码其实有解释
flag这个变量是作为一个标志位,代表符合条件的阶梯数,x初始化为7,代表从7开始找出符合条件的阶梯数。
没有把i%7==0放入条件中,是因为else那儿已经对不符合条件的进行递增了,每次都增加7的整倍数。
当flag为1时说明条件符合,算出了正确的阶梯数,然后输出结果。
但是只能输出符合条件的一个结果,你的代码输出了符合条件的从1到10000之间的阶梯数。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('在程序限定的范围内找不到答案!')

飛魚 发表于 2014-3-5 13:04:18

本帖最后由 飛魚 于 2014-3-5 13:06 编辑

你这会循环一万次吧。。。无论结果对不对都不会停止循环。。。小甲鱼的答案贴在这里,当时我也是很困惑
你那里的if ==True是没必要的,因为条件成立的时候就返回True,不成立就False
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)
      i += 1
if flag == 1:
    print('阶梯数是:', x)
else:
    print('在程序限定的范围内找不到答案!')现在大概理解了一些。

X是总阶梯数,初始化x=7
当同时满足if里的条件,循环结束
如果不满足,则循环+1
至于 x = 7 * (i+1)怎么理解,现在还很模糊,所以可以写成这样:
for x in range(1000):
    if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5) and (x%7 ==0):
    print('阶梯数是:', x)
    break




dandd31 发表于 2014-3-5 13:19:03

谢谢二位大大的回复,已经看明白小甲鱼老师的答案了。顺带在弱弱的问一下,IF 之后的条件都是默认为True的吗?

飛魚 发表于 2014-3-5 13:37:10

if 就是判断 True or False的过程。
if a < 0:
    print(1)
else:
    print(0)
如果a<0那么条件为真,执行print(1)
如果a==0或者a>0,条件为假,执行else

dandd31 发表于 2014-3-6 09:27:26

飛魚 发表于 2014-3-5 13:37 static/image/common/back.gif
if 就是判断 True or False的过程。
if a < 0:
    print(1)


非常感谢 {:7_148:}

864195847@aa.co 发表于 2015-7-26 12:48:54

我来看看

zdhmeng 发表于 2015-7-26 15:10:10

为什么不用for、break呢

xuff 发表于 2015-9-7 15:07:19

你的做法也有效,而且我觉得更简洁一些~

BIGC- 发表于 2016-6-5 04:34:04

赞同,这样可以计算出很多符合条件的数

GNUSEC 发表于 2016-6-26 17:14:56

flag=1和后面flag==1的区别是什么呢?

jby 发表于 2017-2-19 16:25:28

感觉楼主的做法更简洁呢

stonela 发表于 2017-7-12 14:30:00

你这样虽然很直接,但算法效率会低

546397641 发表于 2017-10-22 22:30:22

i=1
while i>0:
    i+=1
    if (i%2==1) and (i%3==2) and (i%5==4) and (i%6==5) and (i%7==0):
      print(i)

小八大蟒蛇 发表于 2018-1-6 00:01:01

我这样写可以吗
foot=1
while not (foot%2==1 and foot%3==2 and foot%5==4 and foot%6==5 and foot%7==0):
    foot=foot+1
print(foot)

席城sky 发表于 2019-8-25 15:23:15

s = 1
while ((s % 2) != 1) or ((s % 3) != 2) or ((s % 5) != 4) or ((s % 6) != 5) or ((s % 7) !=0):
    s += 1
print(s)
我的做法···感觉运算次数会比小甲鱼老师的高

vwangv 发表于 2019-10-31 22:42:27

这样写可以吗?

i = 1

while i:
    if (i % 2 == 1) and \
       (i % 3 == 2) and \
       (i % 5 == 4) and \
       (i % 6 == 5) and \
       (i % 7 == 0):
      print(i)
      break
    i = i + 1

国科练习生 发表于 2020-3-10 22:26:06

i = 1
x =7
flag = 0
while i<=100:
    if i % 2 == 1 and i % 3 == 2 and i % 5 == 4 and i % 6 == 5 :
      flag =1
    else:
      x= 7*(i+1)
    i+=1
if flag==1:
    print(x)

else:
    print("can't find")

感觉不对,输出是707,我自己的代码输出是119

tame47 发表于 2020-3-10 22:38:26

a = 0
while not (( a % 2 == 1) and ( a % 3 == 2 ) and (a % 5 == 4) and ( a % 6 == 5) and (a % 7 == 0)) :
    a = a + 1
print(a)

雨留下的印记 发表于 2020-3-17 22:26:49

i=0
while (i%2 != 1) or (i%3 != 2) or (i%5 != 4) or (i%6 != 5) or (i%7 != 0):
    i =i+1

print('楼梯阶数是:' ,+ i)
我是这样想的,有大佬告知一下最后一行print('楼梯的阶数是:',+i)这里一定要加一个逗号吗?我不加逗号会报错。
页: [1] 2
查看完整版本: python第6课 “爱因斯坦阶梯”问题的疑问