文章目录

  • 一、问题背景
  • 二、问题分析
  • 三、算法代码
  • 四、运行结果
  • 五、代码分析
  • 六、改进一
    • 1.改进分析
    • 2.改进后代码
    • 3.运行结果
  • 七、改进二
    • 1.改进分析
    • 2.改进后代码
    • 3.运行结果
  • 八、改进三
    • 1.改进分析
    • 2.改进后代码
    • 3.运行结果
  • 九、总结

一、问题背景

爱因斯坦曾经出过这样一个数学题,讲的是有一个很长的阶梯,如果每步上跨2 阶,最后只剩 1 阶;每步跨 3 阶,最后剩 2 阶;每步跨5 阶,最后剩 4 阶;每步跨 6 阶,最后剩 5 阶;当每步跨 7 阶时,刚好可以一阶不剩。

二、问题分析

这样的一个长阶梯如果整除2会余1,整除3会余2.……以此内推,这个阶梯数刚好是7的倍数而且要满足前面的所有条件,所以需要循环进行判断某个阶梯数是否满足。

三、算法代码

steps = 7
i = 1
flag = Falsewhile i < 1000:if  (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 ==4) and (steps % 6 == 5) and (steps % 7 ==0):flag = Truebreakelse:steps = steps +1i = i + 1if flag == True:print('阶梯数是:', steps)
else:print('规定范围内找不到答案!')

四、运行结果

五、代码分析

flag = False

这里设置一个flag用于判断是否找到了正确的阶梯数,如果找到了正确答案,flag会被赋值True并跳出循环,然后输出结果。
根据题意可以知道,阶梯数最少有7,所以steps从7开始,并且循环+1,直到找到满足条件的steps。
循环的限制范围要设置的适当,否则会出现在范围内找不到答案的情况。

六、改进一

1.改进分析

因为问题的答案一定是7的倍数,所以可以把答案的范围缩小在7的倍数,并且满足所有条件的数。
所以在判断条件中我们可以去掉steps%7==0这一条,并在steps的循环中,让steps每次多加7,这样得到的答案是相同的,但是计算量更小。

2.改进后代码

steps = 7
i = 1
flag = Falsewhile i < 1000:if (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):flag = Truebreakelse:steps = 7 * (i + 1)i = i + 1if flag == True:print('阶梯数是:', steps)
else:print('规定范围内找不到答案!')

3.运行结果

七、改进二

1.改进分析

当循环限制的范围较大时,正确的答案肯定不止一个,如果要找到正确的答案并且全部输出,就不能再找到第一个答案之后跳出循环,并且在循环时就要输出答案。

2.改进后代码

steps = 7
i = 1while i < 1000:if  (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):print('阶梯数是:', steps)steps = 7 *(i + 1)else:steps = 7 *(i + 1)i = i + 1

3.运行结果


emmm这个答案明显不太符合现实,阶梯数太多的话,像我这种懒狗直接选择坐电梯。
所以我们需要适当的缩小循环的限制范围。

while i < 100:

将这里改为i<100即可,再来看看改之后的运行结果。

八、改进三

这个方法是我别人的博客中发现的,让我眼前一亮,学到了新思路。
原博客:https://blog.csdn.net/qq_43751336/article/details/109623910

1.改进分析

这个方法呢是在写代码之前就要多动脑。
回顾之前的部分条件:如果每步上跨2 阶,最后只剩 1 阶;每步跨 3 阶,最后剩 2 阶;每步跨5 阶,最后剩 4 阶;每步跨 6 阶,最后剩 5 阶。
那么如果多一阶台阶,跨2,3,5,6步都能刚好跨完,而2,3,5,6的最小公倍数是30,30-1=29,那么最小满足以上条件的数是29,所以这个满足条件的阶梯数必须是30的倍数减1。

2.改进后代码

steps = 30-1while steps < 1000:if (steps % 7 == 0):print('阶梯数是:', steps)steps = steps + 30

3.运行结果

九、总结

在这个数学问题中,能得到答案的算法不止一种,只要多思考,就能用更少的代码得到相同的答案,这也是Python的特点之一。我认为一个算法题不是能运行出答案就完事了,应该去尝试不断的改进,不断的找到更快捷的方法,我相信这样对于像我这种初学Python的小白会有很大的提升。

爱因斯坦阶梯数学问题(含有多次改进方法)相关推荐

  1. python编程爱因斯坦的问题_教你如何用编程解决爱因斯坦的数学问题

    曾经爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最后剩1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶.只有每次跨7阶,最后才正好一阶不剩.请问在 ...

  2. 爱因斯坦阶梯问题及寻找完全数问题

    问题一:爱因斯坦阶梯问题 爱因斯坦阶梯问题:有一长阶梯,若每步上2阶,则最后剩1阶,若每步上3阶,最后剩两阶: 若每步上5阶,最后剩4阶:若每步上6阶,最后剩5阶:只有每步上7阶,最后刚好一阶不剩 问 ...

  3. Python爱因斯坦阶梯问题

    爱因斯坦阶梯问题 ·爱因斯坦阶梯问题: 设有一阶梯,每步跨2阶,最后余1阶:每步跨3阶,最后余2阶:每步跨5阶,最后余4阶:每步跨6阶,最后余5阶:只有每步跨7阶时,正好到阶梯顶. 问最少有多少步阶梯 ...

  4. C语言 爱因斯坦阶梯问题

    著名的爱因斯坦阶梯问题是这样的:有一条长长长的阶梯,,如果你每步跨2阶,那么最后剩1阶:如果你每步跨3阶,那么最后剩2阶:如果你每步跨5阶,那么最后剩4阶:如果你每步跨6阶,那么最后剩5阶:最有当你每 ...

  5. python:爱因斯坦阶梯问题

    爱因斯坦阶梯问题 解释:设有台阶若干,每跨2阶,最后余1阶,跨3阶余2阶,跨5阶余4阶,跨6阶余5阶,跨7阶正好到达阶梯顶部. 分析:先假设有i,余2等于1,余3等于2,以此类推.(代码1) i%2 ...

  6. 如果去掉数学前后的空格_理综+数学+地理+英语完型的方法和技巧

    有的同学已经开学了,突然之间面对考试.面对老师的提问,有很多人都感觉自己大脑空白,什么都回答不上来,今天明德君就为大家整理思科的知识点和技巧,帮助大家快速恢复记忆,决胜开学的测试! 一.理综 首先需要 ...

  7. 蹦极模型matlab仿真,科学网—蹦极的数学建模及其龙格-库塔法求解方法 - 赵也非的博文...

    论文: 蹦极的数学建模及其龙格-库塔法求解方法 在"华东师范大学首届研究生数学建模竞赛"中,获得二等奖. 发表日期: 2007年5月 摘要: 本文通过参照题中给出的数据,对蹦极者在 ...

  8. BERT模型的优化改进方法!

    Datawhale干货 来源:Coggle数据科学 本文为论文<BERT模型的主要优化改进方法研究综述>的阅读笔记,对 BERT主要优化改进方法进行了研究梳理. BERT基础 BERT是由 ...

  9. matlab绘图标题含有n=变量的方法(类似c语言)

    按照惯例,先给出结果: 这里的n=5 是自动生成的,类似于c语言的printf输出. 这里我们使用的是 sprintf()函数. 实现title含有n=5(或者某一个数字)的具体的代码如下: titl ...

最新文章

  1. X11: Linux跨网络运行XWindow程序
  2. 【实践驱动开发3-004】TI WL1835MODCOM8 在android的移植 - 系统结构初始化和参考列表
  3. (转)Hibernate框架基础——映射普通属性
  4. Java运行时,指定程序文件的编码
  5. oreo另一个意思_other和another区别:两种不同的“另一个”
  6. SQL查询语句大全集锦
  7. Vue仿支付宝首页(更多)添加、删除、拖拽、点击等功能
  8. 小米air2se耳机只有一边有声音怎么办_几款两百元以内的耳机使用体验
  9. vs2013界面内容_我在2013年阅读的内容
  10. 基于web的木子日记个人博客网站的设计与实现
  11. 论成长型思维的重要性
  12. 打造百亿量级、亿级日活SDK的十大关键要点
  13. DxO one帮助iPhone成像质量超越黑卡
  14. 云计算技术与应用课后答案第四章
  15. 12 个适合做外包项目的开源后台管理系统
  16. 利用Docker创建镜像运行jar包
  17. wan端口未连接怎么弄_wan口未连接是什么意思?
  18. 回溯算法2——填字游戏
  19. 科技主题基金数据分析
  20. Unity软件灵活控制鼠标的隐藏与消失

热门文章

  1. 21Winter\ C语言程序设计第六章
  2. linux .gz文件 解压缩命令的简单使用
  3. FLIR获得美国陆军追加的一份价值2600万美元的核、生物和化学侦察车辆计划合同
  4. 用友OA漏洞学习——test.jsp SQL注入漏洞
  5. 海康威视java读取摄像头数据
  6. 打开ftp服务器上的文件时发生错误。请检查是否有权限访问该文件夹
  7. 【学习笔记】元宇宙:虚实相生的网络世界
  8. powershell美化
  9. Linux中如何一条命令创建多个文件夹
  10. 如何在一台电脑里面,安装两个操作系统,或者又称为双系统?