好吃的小笼包 发表于 2020-6-28 15:07:35

简单的数学题求解代码

python第六讲动动手:爱因斯坦曾出过这样一道有趣的数学题:有一个长阶梯,若每步上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('在程序限定的范围内找不到答案!')


这个问题119,329,539等都满足,题中要求最小阶数,我不懂答案里的程序为什么可以实现仅输出119,我觉得这个写法应该会输出范围内满足条件的最大台阶数吧,毕竟i会一直自加到100,x也会到707,不明白怎么回事,请各位大神解答!

yhhpf 发表于 2020-6-28 15:21:27

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   #当运算到正确答案时,输出的是flag=1,而 x 没有再进行改变了,程序会继续执行但是因为每一次x都不会改变,所以最终用print输出x时,只是第一次正确的结果。
    else:
      x = 7 * (i+1) # 根据题意,x一定是7的整数倍,所以每次乘以7   
    i += 1
   
if flag == 1:
    print('阶梯数是:', x)
else:
    print('在程序限定的范围内找不到答案!')

————————
下面是我第一次看课程时写的代码,感觉更好理解吧?只要循环到了正确答案,直接跳出;

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

Hoiste 发表于 2020-6-28 15:26:32

因为119的时候x就不再执行else下面的 x = 7 * (i+1)操作了,后续的x值被固定为119知道循环结束

好吃的小笼包 发表于 2020-6-28 15:29:05

Hoiste 发表于 2020-6-28 15:26
因为119的时候x就不再执行else下面的 x = 7 * (i+1)操作了,后续的x值被固定为119知道循环结束

x = 119时不会执行else,但是后面的i += 1还是会执行啊,自加完了后还会继续循环啊

Hoiste 发表于 2020-6-28 15:31:51

好吃的小笼包 发表于 2020-6-28 15:29
x = 119时不会执行else,但是后面的i += 1还是会执行啊,自加完了后还会继续循环啊

i+1之后x还是119,还是执行flag = 1

Hoiste 发表于 2020-6-28 15:33:22

好吃的小笼包 发表于 2020-6-28 15:29
x = 119时不会执行else,但是后面的i += 1还是会执行啊,自加完了后还会继续循环啊

看完我打的字,后续x已经没办法进入到else语句了,因为在下一轮循环开始x因为没有*7所以一直是119满足条件执行的是flag = 1,而不会有*7的机会

yifenyu 发表于 2020-6-28 15:33:34

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
      print(x)   #此处打印可以看到匹配119 之后会一直打印119 因为 else 分支不会再进去了 x不会增加 所以得不到329,539等答案
      # break# 正常应该在此处break退出循环 得到最小
    else:
      x = 7 * (i+1) # 根据题意,x一定是7的整数倍,所以每次乘以7
    i += 1

if flag == 1:
    print('阶梯数是:', x)
else:
    print('在程序限定的范围内找不到答案!')

好吃的小笼包 发表于 2020-6-28 15:36:58

哎呀,明白啦,谢谢各位大神!{:5_109:}

Hoiste 发表于 2020-6-28 15:40:24

好吃的小笼包 发表于 2020-6-28 15:36
哎呀,明白啦,谢谢各位大神!

答案这个代码确实不太好,因为无论有没有找到都会跑完整个循环,所以自己有更好的答案的话是很正常的。后面可能还会有很多答案未必是最优解的情况,所以也是建议哪怕现在不会也尽量不要看答案的原因,因为很多时候思路比代码重要。

yhhpf 发表于 2020-6-28 16:19:31

好吃的小笼包 发表于 2020-6-28 15:29
x = 119时不会执行else,但是后面的i += 1还是会执行啊,自加完了后还会继续循环啊

老板是没看到我第一段代码 flag = 1 后面的那段么,竟然不是最佳{:10_266:}
页: [1]
查看完整版本: 简单的数学题求解代码