1.
素数求和问题
时间限制:3000 ms | 内存限制:65535 KB
难度:2
输入
第一行给出整数M(0<M<10)代表多少组测试数据
每组测试数据第一行给你N,代表该组测试数据的数量。
接下来的N个数为要测试的数据,每个数小于1000
输出
每组测试数据结果占一行,输出给出的测试数据的所有素数和
样例输入
3
5
1 2 3 4 5
8
11 12 13 14 15 16 17 18
10
21 22 23 24 25 26 27 28 29 30
样例输出
10
41
52
描述
现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和。
其实我个人认为这道题难点在于输入输出,方法有很多,打表,素数筛http://blog.csdn.net/qq_32680617/article/details/50629574等等。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
const int maxn=1005;
int a[maxn];//数组存放是素数的标记为1
using namespace std;
void isPrime()
{
memset(a,1,sizeof(a));//memset函数在cstring头文件中,假设全部为1,后面再删除
a[1]=0;//1既不是素数也不是合数记为0
for(int i=2;i<sqrt(maxn);i++)//这用的是一个性质,自己可以百度一下
{
if(a[i])//如果i是素数,那么它与其他数的乘积必然是合数
{
for(int j=2;j*i<=maxn;j++)
a[i*j]=0;//i与其他数相乘必定为合数标记为0
}
}
}
int main()
{
isPrime();
int m;
cin>>m;//输入几组样例
while(m--)
{
int n;
int sum=0;//初始化
cin>>n;//例如第一组样例输入几个数
while(n--)
{
int flag;
cin>>flag;
if(a[flag])
sum+=flag;
}
printf("%d\n",sum);
}
return 0;
}
我这是仿照某位大佬的写的,emmmm,感觉这种方法比较好。还是大佬说得好要去思考为什么这样做?并且去质疑,为什么要这样做,首先求素数的方法,素数筛,然后注意细节。