游客 Signup | Login
中文 | En

1810 - 素数求和问题

现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和。

Input

第一行给出整数M(0<M<10)代表多少组测试数据
每组测试数据第一行给你N,代表该组测试数据的数量。
接下来的N个数为要测试的数据,每个数小于1000000

Output

每组测试数据结果占一行,输出给出的测试数据的所有素数和。

Examples

Input

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

Output

10
41
52

Solution C

#include <stdio.h>
#include <string.h>
#define MAX 1000004
char isPrime[MAX];
int main(){
    int total, n, i, j, N, sum;
    memset(isPrime, 1, MAX);
    isPrime[0] = 0;
    isPrime[1] = 0;
    for(i = 4; i < MAX; i+=2)
        isPrime[i] = 0;
    for(i = 3; i < MAX; i+=2){
        if(!isPrime[i]) continue;
        for(j = i + i; j < MAX; j+=i){
            isPrime[j] = 0;
        }
    }
    scanf("%d", &total);
    while(total--){
        scanf("%d", &n);
        for(i = sum = 0; i < n; i++){
            scanf("%d", &N);
            if(isPrime[N])
                sum += N;
        }
        printf("%d\n", sum);
    }
    return 0;
}

Solution C++

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1000000;
int i,j;
int t,a,n,s;
bool f[N+1];
void work()
{
	for(i=3;i<=N;i++)
	{
		if(!f[i])
			for(j=3*i;j<=N;j+=2*i)
				f[j]=1;
	}
}
int main()
{
	work();
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		s=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a);
			if(a==1||(a>2&&a%2==0))
				continue;
			if(!f[a])
				s+=a;
		}
		printf("%d\n",s);
	}
	return 0;
}
Time Limit 3 seconds
Memory Limit 128 MB
Discuss Stats
上一题 下一题