素数求和问题
题目一、素数求和问题
描述
现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和。
输入
第一行给出一个整数N,表示测试数据的数量。接下来的N个数为要测试的数据,每个数小于1000
输出
每组测试数据结果占一行,输出给出的测试数据的所有素数和
样例输入
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
15
12 34 55 34 109 987 23 44 33 12 434 555 344 779 101
20
999 976 977 773 373 374 23 45 56 789 123 234 55 34 23 23 545 547 23 888
样例输出
10
41
52
233
2762
解题思路:
由题意知,输入的数的最大值在1000以内,所以可用int存放,判断素数我们通常的做法是从1开始依次和目标数求余,因此时间复杂度是O(n),但是,由余数的性质我们知道,如果2~n - 1当中存在n的约数,不妨设为k,既n % k == 0,那么由k * (n / k) == n 可知,n/k也是n的一个约数,且k与n/k满足一个大于sqrt(n), 一个小于sqrt(n),因此只需要判断n能否被2,3,......,sqrt(n)整除,即可判断n是否为素数,时间复杂度从O(n)下降到O(sqrt(n))。
代码如下:
1 #include <cstdio> 2 #define MAXN 1010; 3 bool isPrime(int n) {//判断是否为素数 4 if(n <= 1) return false;//不判断0及负数 5 for (int i = 2; i * i <= n; i++) { 6 //遍历2~sqrt(n),这种写法只有在n没有接近int的上限才能成立 7 if (n % i == 0) return false; 8 } 9 return true; 10 } 11 12 int main() { 13 int a ; 14 int ans = 0; 15 int n; 16 int i = 0; 17 scanf("%d", &n); 18 while (n--) { 19 scanf("%d", &a); 20 if (isPrime(a)) ans += a; 21 } 22 printf("%d\n", ans); 23 return 0; 24 }