傲渊山岳 发表于 2025-4-6 16:16:51

蓝桥杯:标记名称

1. 标题要求

标题要求是:


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

你的代码逻辑是:
N = int(input())
k = 0
i = 2
while i < N:
if N % i != 0:
    k += 1
    i += 1
print(k) 这段代码的主要逻辑是:


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

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

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

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

[*]输出终极的标记数量。
4. 正确的代码实现

以下是根据标题要求实现的代码:
N = int(input())# 输入等分数 N
marked_positions = set()# 用来存储已经标记过的位置
new_marks = 0# 新增的标记数量

for i in range(2, N + 1):# 从 2 开始到 N 等分
    for k in range(1, i):# 检查每个位置 k/i
      position = k / i
      if position not in marked_positions:# 如果这个位置没有标记过
            marked_positions.add(position)# 标记这个位置
            new_marks += 1# 增加标记数量

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要是除不尽,数太大,内存会崩,
所以,我们必要找到一种更高效的方法来计算新增的标记数量,而不是直接存储每个位置。用欧拉函数,
关键点:欧拉函数

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

我们可以通过计算欧拉函数来办理这个问题,而不必要存储大量的浮点数。
import math

def euler_phi(n):
    """计算欧拉函数值"""
    result = n
    p = 2
    while p * p <= n:
      if n % p == 0:
            while n % p == 0:
                n //= p
            result -= result // p
      p += 1
    if n > 1:
      result -= result // n
    return result

N = int(input())
print(euler_phi(N))

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 蓝桥杯:标记名称