1810 - 素数求和问题
时间限制 : 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; } }