1810 - 素数求和问题

通过次数

0

提交次数

0

时间限制 : 3 秒 内存限制 : 128 MB

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

题目输入

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

题目输出

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

输入/输出样例

输入格式

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

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;
}

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;
}

Java解答

import java.util.Scanner;
public class Main
{
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		int M=sc.nextInt();
		for(int a=1;a<=M;a++)
		{
			int N=sc.nextInt();
			int[] arr=new int[N];
			int sums=0;
			for(int i=0;i<N;i++)
			{
				arr[i]=sc.nextInt();
			}
			for(int i=0;i<N;i++)
			{
				int sum=isPrime(arr[i]);
				sums+=sum;
			}
			System.out.println(sums);
		}
	}
	public static int isPrime(int num)//判断是否为素数
	{
		if(num>1)
		{
			for(int i=2;i<num;i++)
			{
				if(num%i==0)
					return 0;
			}
		}
		else
			return 0;
		return num;
	}
}