A296.体育课 - 题解
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题核心理解
这道题的本质是:从一组给定的数字中,根据指定的位置索引,筛选出那些是素数的数字,并将它们相加得到总和。
解题步骤分解
数据读取与存储
1.读取三个关键部分:小朋友总人数 n 和要挑选的人数 m。
2.读取一个长度为 n 的数组,按顺序存储每个小朋友卡片上的数字。
3.读取一个长度为 m 的数组,存储老师挑选的小朋友的编号(注意:题目中编号从 1 开始)。
素数判断函数 (本人没做,因为你会发现直接循环判断一下就行)
你需要实现一个判断素数的函数。素数(质数)是大于1的自然数,且只能被1和它自身整除。
优化思路:检查一个数 x 是否为素数时,只需用 2 到 √x(x的平方根)之间的整数去试除即可。因为如果 x 有大于 √x 的因数,那么它必然有一个小于 √x 的对应因数。
遍历与求和
遍历老师给出的 m 个编号。对于每个编号 qi:
索引转换:由于我们存储卡片数字的数组索引通常从0开始,而小朋友编号从1开始。所以,要获取对应卡片数字,需要用 qi - 1 作为下标去访问第一步中存储的数组。
判断与累加:取出该数字,用素数判断函数进行检查。
如果它是素数,则将其累加到一个 总和 (sum) 变量中。
输出结果
将计算得到的总和 sum 输出。
关键点与注意事项
索引转换:这是最容易出错的地方。一定要清楚题目输入的“编号”是从1开始的,而编程中数组往往是0开始索引的。
效率考虑:n 和 m 的最大值在题目中未明确给出,但采用 O(√x) 的素数判断方法对于一般竞赛题目的数据范围是足够高效的。
特殊值处理:在实现素数判断函数时,要记得数字 1 不是素数,最小的素数是 2。
思路流程图
整个过程可以总结为以下流程:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
代码实现(ALL AC,可放心食用)
蒜鸟蒜鸟,睡了