IT评测·应用市场-qidao123.com技术社区
标题:
蓝桥杯:标记名称
[打印本页]
作者:
傲渊山岳
时间:
2025-4-6 16:16
标题:
蓝桥杯:标记名称
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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4