天天看點

素數求和

描述

現在給你n個數(0<n<1000),現在要求你寫出一個程式,找出這n個數中的所有素數,并求和。

輸入

第一行給出整數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

樣例輸出

41

52

采用篩法求素數,1000以内的素數,使用70ms左右,測試的時候,不同時刻運作

,得到的時間不同,差别不大。我也不明白為什麼!

代碼如下:

#include <iostream>

#include <cstring>

#include <cstdio>

using namespace std;

#define max_size 1000

bool isprime[max_size];

void createprimetable()

{

memset(isprime, true, sizeof(isprime));

isprime[0] = isprime[1] = false;

int i, j;

for (i = 2; i * i <= max_size; i++)

if (isprime[i])

for (j = i * 2; j <= max_size; j += i)

isprime[j] = false;

}

int main()

createprimetable();

int m, n;

cin >> m;

for (int i = 1; i <= m; i++)

int sum = 0, a;

scanf("%d", &n);

for (int j = 1; j <= n; j++)

scanf("%d", &a);

if (isprime[a])

sum += a;

printf("%d\n", sum);

return 0;