【趣学Python算法100例】爱因斯坦的数学题

问题描述

爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最后剩一阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶,则最后剩5阶。只有每次跨7阶,最后才正好一阶不剩。请问在1到n内,有多少个数能满足?

问题分析

根据题意,用变量x表示阶梯数,则阶梯数x应该同时满足以下条件:

  • 若每步跨2阶,则最后剩1阶,即x%2=1
  • 若每步跨3阶,则最后剩2阶,即x%3=2
  • 若每步跨5阶,则最后剩4阶,即x%5=4
  • 若每步跨6阶,则最后剩5阶,即x%6=5
  • 若每步跨7阶,最后才正好一阶不剩,即x%7=0

算法设计

该问题要求输入n值,求解出在1-n的范围内存在多少个满足要求的阶梯数。在算法设计中,我们使用while循环,将循环条件设置为True,以允许重复读入多个n值。

对每一次读入的n值,都要判断在1-n的范围内存在的满足要求的阶梯数的个数。判断时可采用for循环,循环变量设为i,由题意:

阶梯数需要满足以下条件:

  1. 能被7整除。
  2. 除以6余5。
  3. 除以5余4。
  4. 除以3余2。

由于这些条件的限制,我们从7开始检查,因为7是满足第一个条件的最小整数。

循环条件为i<n;循环体中则使用问题分析中列出的5个条件来检验每一个i值,能够满足所有5个条件的i值即为所求的阶梯数。

确定程序框架

由上述分析可知,该程序的主体是一个循环结构。

  1. 输入n值。
python 复制代码
while True:
    n = int(input("请输入n值:"))
  1. 找到满足要求的阶梯数。
python 复制代码
for i in range(7, n+1):
    # 判断条件

使用for循环检查每一个i值是否满足判断条件。

程序流程图如下图所示:

完整程序

据上面的分析,编写程序如下:

python 复制代码
def computing_ladder(n):
    # 输入验证
    if not isinstance(n, int) or n < 1:
        raise ValueError("n must be a positive integer")

    print(f"在1-{n}之间的阶梯数为:")
    count = 0
    for i in range(7, n+1):
        # 阶梯数所满足的条件
        if (i % 7 == 0) and (i % 6 == 5) and (i % 5 == 4) and (i % 3 == 2):
            count += 1                              # count记录1~n之间满足条件的阶梯个数
            print(f"{i}")
    print(f"在1-{n}之间,有{count}个数可以满足爱因斯坦对阶梯的要求。")

if __name__=="__main__":
    while True:
        n = int(input("请输入n值:"))
        computing_ladder(n)

运行结果

在vscode下运行程序,结果如下图所示。由输出结果可知,在1~200之间满足条件的阶梯数只有1个,为119;在1~400之间满足条件的阶梯数有2个,为119和329;在1~600之间满足条件的阶梯数有3个,为119、329和539。

相关推荐
陪我一起学编程41 分钟前
关于nvm与node.js
vue.js·后端·npm·node.js
舒一笑1 小时前
基于KubeSphere平台快速搭建单节点向量数据库Milvus
后端
JavaBuild1 小时前
时隔半年,拾笔分享:来自一个大龄程序员的迷茫自问
后端·程序员·创业
一只叫煤球的猫2 小时前
虚拟线程生产事故复盘:警惕高性能背后的陷阱
java·后端·性能优化
周杰伦fans3 小时前
C#中用于控制自定义特性(Attribute)
后端·c#
Livingbody4 小时前
GitHub小管家Trae智能体介绍
后端
考虑考虑4 小时前
rollback-only事务
spring boot·后端·spring
mrchan4 小时前
mongodb数组避免过大
后端
AirMan4 小时前
除了Cookie会话跟踪技术,你还知道其他的会话跟踪技术吗?会话技术的方案对比
后端
uhakadotcom4 小时前
Python中@staticmethod和@classmethod的简单理解与实用示例
javascript·后端