鱼C论坛

 找回密码
 立即注册
查看: 231|回复: 3

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

[复制链接]
发表于 2025-4-11 16:29:53 | 显示全部楼层 |阅读模式

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

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

x
爱因斯坦曾出过这样一道有趣的数学题:有一个长阶梯,若每步上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('在程序限定的范围内找不到答案!')
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-4-11 16:30:48 | 显示全部楼层
解答

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

step += 1 的暴力枚举方式需要遍历所有自然数:
  • 需要检查每个数字是否符合5个条件
  • 当正确解是119时,需要执行119次循环


而老师的 x = 7*i 利用了关键条件优化:
  • 直接遍历7的倍数(满足最后"刚好被7整除"的条件)
  • 每次只需检查4个余数条件
  • 当正确解是119时,只需执行17次循环(119/7=17)



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


效率对比数据:
  • 鱼油代码执行119次循环,检查595次条件
  • 老师代码执行17次循环,检查68次条件


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-11 17:11:09 | 显示全部楼层
  1. print("=====================================================================")
  2. print('''爱因斯坦曾出过这样一道有趣的数学题:
  3. 有一个长阶梯,若每步上2阶,最后剩1阶;
  4. 若每步上3阶,最后剩2阶;
  5. 若每步上5阶,最后剩4阶;
  6. 若每步上6阶,最后剩5阶;
  7. 只有每步上7阶,最后刚好一阶也不剩。
  8. 求解该阶梯至少有多少阶?''')
  9. print("=====================================================================")
  10. for step in range(7 , 1000 , 7) :
  11.     if (step % 2 == 1) and (step % 3 == 2) and (step % 5 == 4) and (step % 6 == 5) :
  12.         print("解答:至少有" , step , "级台阶")
  13.         break   
  14. input('按下回车键 . . .')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-12 16:24:42 | 显示全部楼层
第二个更高效,因为他是 7 个 7 个的加,所以从 1 遍历到 x 只需要 x/7 次循环;但第一个需要遍历 x 次。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 15:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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