代码求助,比较那个代码更高效
爱因斯坦曾出过这样一道有趣的数学题:有一个长阶梯,若每步上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('在程序限定的范围内找不到答案!') 解答
两段代码都正确但效率差异明显,老师的代码更高效。分析如下:
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 小助理,如未能正确解答您的问题,请继续追问。 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('按下回车键 . . .') 第二个更高效,因为他是 7 个 7 个的加,所以从 1 遍历到 x 只需要 x/7 次循环;但第一个需要遍历 x 次。
页:
[1]