• 素数求和问题


    题目一、素数求和问题

    描述

    现在给你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的一个约数,且kn/k满足一个大于sqrt(n), 一个小于sqrt(n),因此只需要判断n能否被23......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 }
  • 相关阅读:
    关于MySQL数据库中null的那些事
    Java集合之Collections 剖析
    字符串类
    C++标准库
    << 操作符
    操作符的重载
    类中的重载
    友元
    二阶构造模式
    静态成员函数
  • 原文地址:https://www.cnblogs.com/MATLABlearning001/p/5396925.html
Copyright © 2020-2023  润新知