zoukankan      html  css  js  c++  java
  • UVALive6050 Primes【素数筛选+前缀和】

    Primes

    Let m and n be two integers, 2 ≤ m < n ≤ 10000000. Consider the following set:
    P rime(m, n) = {p|p prime and m ≤ p ≤ n}.
    Compute the cardinal of the set P rime(m, n).
    Input
    The input consists of several tests. The input of each test is represented on a single line in the input.
    Any two consecutive tests are separated by an empty line. For each test, the values for m and n are
    given on the same line, separated by exactly one space.
    Output
    For each test, the result will be written to standard output on a different line (the tests will have the
    same order as in the input file). The results of any two consecutive tests will be separated by an empty
    line. For each test, the result will be the cardinal of the set Prime(m, n).
    Sample Input
    2 20
    70 110
    5 150
    Sample Output
    8
    10
    33



    Regionals 2012 >> Europe - Southeastern


    问题链接UVALive6050 Primes

    题意简述:参见上文。

    问题分析:用Eratosthenes筛选法筛选素数,然后计算素数数量的前缀和,根据输入的数据范围做个减法即可。

    程序说明:程序中有一个坑,需要注意。

    参考链接:(略)


    AC的C++语言程序如下:

    /* UVALive6050 Primes */
    
    #include <iostream>
    #include <string.h>
    #include <math.h>
    
    using namespace std;
    
    const int N = 10000000;
    int prefixsum[N+1];
    
    // Eratosthenes筛选法+计算前缀和
    void sieveofe(int n)
    {
        memset(prefixsum, 0, sizeof(prefixsum));
    
        prefixsum[0] = prefixsum[1] = 1;
        for(int i=2; i<=sqrt(n); i++) {
            if(!prefixsum[i]) {
                for(int j=i*i; j<=n; j+=i)  //筛选
                    prefixsum[j] = 1;
            }
        }
    
        prefixsum[0] = 0;
        for(int i=1; i<=n; i++)
            if(prefixsum[i])
                prefixsum[i] = prefixsum[i - 1];
            else
                prefixsum[i] = prefixsum[i - 1] + 1;
    }
    
    int main()
    {
        sieveofe(N);
    
        int n, m;
        bool flag = false;
    
        while(cin >> n >> m) {
            if(n>m)             // 坑:没说哪个数大
                swap(n, m);
            if(flag)
                cout << endl;
            cout << prefixsum[m] - prefixsum[n - 1] << endl;
            flag = true;
        }
    
        return 0;
    }






  • 相关阅读:
    Java导出数据生成Excel表格
    JFinal极速开发框架使用笔记
    短信接口发送验证码倒计时以及提交验证
    quartz定时任务,已过期的内容自动下线
    cors解决Web跨域访问问题
    python之django直接执行sql语句
    Django中字典在html中的遍历
    Django 中的自定义分页标签
    myslq中插入时间当前时间
    mysql中排序
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563692.html
Copyright © 2011-2022 走看看