题解>>>指定的位置索引筛选出素数
2026-02-06 09:43:43
发布于:天津
12阅读
0回复
0点赞
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。
思路流程图
整个过程可以总结为以下流程:
开始 → 读入n, m → 读入n个卡片数字 → 读入m个指定编号 → 初始化总和为0
↓
遍历m个编号 → 根据编号取出卡片数字 → 该数字是素数吗? → 是 → 加入总和
↓ ↓
←--------------------------------------- 否
↓
遍历结束? → 否 → 继续下一个编号
↓是
输出总和
↓
结束
代码实现(all AC,可放心食用)
#include <bits/stdc++.h>
using namespace std;
int a[1000];
int n,m,sum=0,t;
bool flag;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
flag = true;
scanf("%d",&t);
for(int j=2;j<a[t];j++)
{
if(a[t]%j == 0)
{
flag = false;
break;
}
}
if(flag)
{
sum += a[t];
}
}
printf("%d",sum);
return 0;//不忘好习惯,歇菜
}
蒜鸟蒜鸟,睡了
全部评论 1
施舍蒟蒻一点赞吧....球球了........
2026-02-05 来自 天津
0




有帮助,赞一个