马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
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企服之家,中国第一个企服评测及商务社交产业平台。 |