蓝桥杯:标记名称

打印 上一主题 下一主题

主题 1788|帖子 1788|积分 5364

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
1. 标题要求

标题要求是:


  • 将横幅不停等分(从 2 等分开始,每次增长 1 等分)。
  • 在每个新的分数位置(k/N,其中 1≤k<N)标记选手名字。
  • 如果某个位置已经标记过,则不再重复标记。
  • 必要计算在第 N 次等分时,新增的标记数量。
2. 你的代码逻辑

你的代码逻辑是:
  1. N = int(input())
  2. k = 0
  3. i = 2
  4. while i < N:
  5.   if N % i != 0:
  6.     k += 1
  7.     i += 1
  8. print(k)
复制代码
这段代码的主要逻辑是:


  • 从 2 开始,检查每个数 i 是否是 N 的因数。
  • 如果 N % i != 0,则 k 加 1。
  • 最后输出 k。
这个逻辑显然与标题要求不符。你的代码实际上是在计算小于 N 的非因数的个数,而不是在模仿横幅标记的过程。
3. 正确的思路

要办理这个问题,我们必要模仿横幅标记的过程。具体步调如下:

  • 初始化一个集合:用来存储已经标记过的位置。
  • 从 2 开始等分横幅:每次将横幅 N 等分,计算每个新的分数位置 k/N(1≤k<N)。
  • 检查每个位置是否已经标记

    • 如果某个位置 k/N 已经在集合中,跳过。
    • 如果不在集合中,将其参加集合,并增长标记数量。

  • 输出终极的标记数量
4. 正确的代码实现

以下是根据标题要求实现的代码:
  1. N = int(input())  # 输入等分数 N
  2. marked_positions = set()  # 用来存储已经标记过的位置
  3. new_marks = 0  # 新增的标记数量
  4. for i in range(2, N + 1):  # 从 2 开始到 N 等分
  5.     for k in range(1, i):  # 检查每个位置 k/i
  6.         position = k / i
  7.         if position not in marked_positions:  # 如果这个位置没有标记过
  8.             marked_positions.add(position)  # 标记这个位置
  9.             new_marks += 1  # 增加标记数量
  10. print(new_marks)  # 输出新增的标记数量
复制代码
5. 为什么你的代码不对



  • 逻辑不符:你的代码逻辑是检查因数,而不是模仿横幅标记的过程。
  • 没有模仿标记过程:标题要求的是模仿横幅标记的过程,而你的代码没有涉及到分数位置的标记。
  • 没有思量重复标记:标题明确提到如果某个位置已经标记过,则不再重复标记,而你的代码没有实现这一点。
通过上述分析,你应该可以清晰地看到你的代码与标题要求之间的差距。希望这个解释对你有资助!
差距在哪呀?为什么我写不出?
1. 理解问题的深度



  • 问题理解:你大概没有完全理解标题要求的标记规则。比如,标题中提到的“每次把横幅 N 等分”和“新的 k/N 的位置”必要仔细理解。如果对这些规则理解模糊,就很难写出正确的代码。
  • 示例分析:可以尝试手动模仿一下前几次的标记过程,看看横幅上哪些位置被标记了,哪些没有。这样可以资助你更好地理解规则。
2. 数学基础和逻辑思维



  • 数学知识:这个问题涉及到分数的性质和因数分解。比如,1/2 和 2/4 实在是同一个位置,由于它们可以约分。如果对分数的性质不够熟悉,大概会在判断位置是否重复时堕落。
  • 逻辑推理:必要清晰地梳理每次等分横幅后哪些位置是新的,哪些是重复的。这必要一定的逻辑推理能力。
3. 编程技巧和实现能力



  • 数据布局选择:在编程实现时,必要选择符合的数据布局来存储已经标记的位置。比如,可以用一个集合(set)来存储已经标记的分数,由于集合可以快速判断一个元素是否存在。
  • 循环和条件判断:必要正确地实现循环,从 N=2 开始,逐步增长 N,并在每个新的位置判断是否已经标记过。这必要熟练掌握循环和条件判断的语法。
 4.缺乏练习和经验


5. 心理因素



一些具体的发起




  • 类似问题的练习:如果之前没有打仗过类似的问题,大概会以为无从动手。多做一些类似的标题,比如涉及分数、因数分解或集合操作的标题,可以积累经验。
  • 总结方法:每次做完题后,总结一下解题思路和方法,看看哪些地方做得好,哪些地方可以改进。
  • 信心不足:有时候,大概是由于对自己缺乏信心,以为自己写不出。实在,只要静下心来,一步步分析,许多问题都能办理。
  • 耐烦不足:遇到困难时,大概会急于求成,没有耐烦去仔细思考。多给自己一些时间,不要轻易放弃。
  • 多读标题:仔细读几遍标题,确保理解每一个细节。
  • 手动模仿:先手动模仿前几次的标记过程,看看横幅上哪些位置被标记了。
  • 分解问题:把问题分解成小步调,一步步实现。比如,先实现二等分的标记,再实现三等分,逐步增长复杂度。
  • 多写代码:多练习类似的标题,积累经验。
  • 寻求资助:如果实在写不出来,可以看看别人的代码,学习他们的思路和方法
它给的也不对。
1.每一次都算,例如1/2,2/4,浪费空间
2.k / i要是除不尽,数太大,内存会崩,
所以,我们必要找到一种更高效的方法来计算新增的标记数量,而不是直接存储每个位置。用欧拉函数,
关键点:欧拉函数

欧拉函数 表示小于 且与 互质的正整数的个数。对于一个分数 ,如果 和 互质,那么这个位置是新增的标记位置。因此,新增的标记数量 实际上就是 。
优化后的代码

我们可以通过计算欧拉函数来办理这个问题,而不必要存储大量的浮点数。
  1. import math
  2. def euler_phi(n):
  3.     """计算欧拉函数值"""
  4.     result = n
  5.     p = 2
  6.     while p * p <= n:
  7.         if n % p == 0:
  8.             while n % p == 0:
  9.                 n //= p
  10.             result -= result // p
  11.         p += 1
  12.     if n > 1:
  13.         result -= result // n
  14.     return result
  15. N = int(input())
  16. print(euler_phi(N))
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

傲渊山岳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表