angel_wy 发表于 2025-4-11 16:29:53

代码求助,比较那个代码更高效

爱因斯坦曾出过这样一道有趣的数学题:有一个长阶梯,若每步上2阶,最后剩1阶;若每步上3阶,最后剩2阶;若每步上5阶,最后剩4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后刚好一阶也不剩。
(小甲鱼温馨提示:步子太大真的容易扯着蛋~~~)

题目:请编程求解该阶梯至少有多少阶?

我的代码:
print("=====================================================================")
print("爱因斯坦曾出过这样一道有趣的数学题:\n有一个长阶梯,若每步上2阶,最后剩1阶;\n若每步上3阶,最后剩2阶;\n若每步上5阶,最后剩4阶;\n若每步上6阶,最后剩5阶;\n只有每步上7阶,最后刚好一阶也不剩。\n求解该阶梯至少有多少阶?")
print()
input()
step = 0
while not ((step %2 == 1) and (step %3 == 2) and (step %5 == 4) and (step %6 == 5) and (step %7 == 0)):
    step += 1
else:
    print("解答:至少有" + str(step)+ "级台阶")
input()


老师的参考代码:
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('在程序限定的范围内找不到答案!')

FishC 发表于 2025-4-11 16:30:48

解答

两段代码都正确但效率差异明显,老师的代码更高效。分析如下:

step += 1 的暴力枚举方式需要遍历所有自然数:

[*]需要检查每个数字是否符合5个条件
[*]当正确解是119时,需要执行119次循环


而老师的 x = 7*i 利用了关键条件优化:

[*]直接遍历7的倍数(满足最后"刚好被7整除"的条件)
[*]每次只需检查4个余数条件
[*]当正确解是119时,只需执行17次循环(119/7=17)



# 最优解法参考代码
x = 7
i = 1
while True:
    if x%2==1 and x%3==2 and x%5==4 and x%6==5:
      print(f"解答:至少有{x}级台阶")
      break
    i += 1
    x = 7 * i


效率对比数据:

[*]鱼油代码执行119次循环,检查595次条件
[*]老师代码执行17次循环,检查68次条件


优化思路
当遇到此类问题时,应该:
1. 优先利用最严格的条件(这里是7的倍数)
2. 通过数学观察减少循环次数(如利用步长7的增量)
3. 减少每次循环的条件判断次数

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2025-4-11 17:11:09

print("=====================================================================")
print('''爱因斯坦曾出过这样一道有趣的数学题:
有一个长阶梯,若每步上2阶,最后剩1阶;
若每步上3阶,最后剩2阶;
若每步上5阶,最后剩4阶;
若每步上6阶,最后剩5阶;
只有每步上7阶,最后刚好一阶也不剩。
求解该阶梯至少有多少阶?''')
print("=====================================================================")
for step in range(7 , 1000 , 7) :
    if (step % 2 == 1) and (step % 3 == 2) and (step % 5 == 4) and (step % 6 == 5) :
      print("解答:至少有" , step , "级台阶")
      break   
input('按下回车键 . . .')

tommyyu 发表于 2025-4-12 16:24:42

第二个更高效,因为他是 7 个 7 个的加,所以从 1 遍历到 x 只需要 x/7 次循环;但第一个需要遍历 x 次。
页: [1]
查看完整版本: 代码求助,比较那个代码更高效