爱因斯坦阶梯数学问题(含有多次改进方法)
文章目录
- 一、问题背景
- 二、问题分析
- 三、算法代码
- 四、运行结果
- 五、代码分析
- 六、改进一
- 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的小白会有很大的提升。
爱因斯坦阶梯数学问题(含有多次改进方法)相关推荐
- python编程爱因斯坦的问题_教你如何用编程解决爱因斯坦的数学问题
曾经爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最后剩1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶.只有每次跨7阶,最后才正好一阶不剩.请问在 ...
- 爱因斯坦阶梯问题及寻找完全数问题
问题一:爱因斯坦阶梯问题 爱因斯坦阶梯问题:有一长阶梯,若每步上2阶,则最后剩1阶,若每步上3阶,最后剩两阶: 若每步上5阶,最后剩4阶:若每步上6阶,最后剩5阶:只有每步上7阶,最后刚好一阶不剩 问 ...
- Python爱因斯坦阶梯问题
爱因斯坦阶梯问题 ·爱因斯坦阶梯问题: 设有一阶梯,每步跨2阶,最后余1阶:每步跨3阶,最后余2阶:每步跨5阶,最后余4阶:每步跨6阶,最后余5阶:只有每步跨7阶时,正好到阶梯顶. 问最少有多少步阶梯 ...
- C语言 爱因斯坦阶梯问题
著名的爱因斯坦阶梯问题是这样的:有一条长长长的阶梯,,如果你每步跨2阶,那么最后剩1阶:如果你每步跨3阶,那么最后剩2阶:如果你每步跨5阶,那么最后剩4阶:如果你每步跨6阶,那么最后剩5阶:最有当你每 ...
- python:爱因斯坦阶梯问题
爱因斯坦阶梯问题 解释:设有台阶若干,每跨2阶,最后余1阶,跨3阶余2阶,跨5阶余4阶,跨6阶余5阶,跨7阶正好到达阶梯顶部. 分析:先假设有i,余2等于1,余3等于2,以此类推.(代码1) i%2 ...
- 如果去掉数学前后的空格_理综+数学+地理+英语完型的方法和技巧
有的同学已经开学了,突然之间面对考试.面对老师的提问,有很多人都感觉自己大脑空白,什么都回答不上来,今天明德君就为大家整理思科的知识点和技巧,帮助大家快速恢复记忆,决胜开学的测试! 一.理综 首先需要 ...
- 蹦极模型matlab仿真,科学网—蹦极的数学建模及其龙格-库塔法求解方法 - 赵也非的博文...
论文: 蹦极的数学建模及其龙格-库塔法求解方法 在"华东师范大学首届研究生数学建模竞赛"中,获得二等奖. 发表日期: 2007年5月 摘要: 本文通过参照题中给出的数据,对蹦极者在 ...
- BERT模型的优化改进方法!
Datawhale干货 来源:Coggle数据科学 本文为论文<BERT模型的主要优化改进方法研究综述>的阅读笔记,对 BERT主要优化改进方法进行了研究梳理. BERT基础 BERT是由 ...
- matlab绘图标题含有n=变量的方法(类似c语言)
按照惯例,先给出结果: 这里的n=5 是自动生成的,类似于c语言的printf输出. 这里我们使用的是 sprintf()函数. 实现title含有n=5(或者某一个数字)的具体的代码如下: titl ...
最新文章
- X11: Linux跨网络运行XWindow程序
- 【实践驱动开发3-004】TI WL1835MODCOM8 在android的移植 - 系统结构初始化和参考列表
- (转)Hibernate框架基础——映射普通属性
- Java运行时,指定程序文件的编码
- oreo另一个意思_other和another区别:两种不同的“另一个”
- SQL查询语句大全集锦
- Vue仿支付宝首页(更多)添加、删除、拖拽、点击等功能
- 小米air2se耳机只有一边有声音怎么办_几款两百元以内的耳机使用体验
- vs2013界面内容_我在2013年阅读的内容
- 基于web的木子日记个人博客网站的设计与实现
- 论成长型思维的重要性
- 打造百亿量级、亿级日活SDK的十大关键要点
- DxO one帮助iPhone成像质量超越黑卡
- 云计算技术与应用课后答案第四章
- 12 个适合做外包项目的开源后台管理系统
- 利用Docker创建镜像运行jar包
- wan端口未连接怎么弄_wan口未连接是什么意思?
- 回溯算法2——填字游戏
- 科技主题基金数据分析
- Unity软件灵活控制鼠标的隐藏与消失