NYOJ 素数求和问题

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,感觉这种方法比较好。还是大佬说得好要去思考为什么这样做?并且去质疑,为什么要这样做,首先求素数的方法,素数筛,然后注意细节。

猜你喜欢

转载自blog.csdn.net/cjh1459463496/article/details/81778051