zoukankan      html  css  js  c++  java
  • Aizu:0009- Prime Number

    Prime Number

    Time limit 1000 ms
    Memory limit 131072 kB

    Problem Description

    Write a program which reads an integer n and prints the number of prime numbers which are less than or equal to n. A prime number is a natural number which has exactly two distinct natural number divisors: 1 and itself. For example, the first four prime numbers are: 2, 3, 5 and 7.

    Input

    Input consists of several datasets. Each dataset has an integer n (1 ≤ n ≤ 999,999) in a line.

    The number of datasets is less than or equal to 30.

    Output

    For each dataset, prints the number of prime numbers.

    Sample Input

    10
    3
    11

    Output for the Sample Input

    4
    2
    5


    解题心得:

    1. 题意就是给你一个数n,问你在不大于n的数里有多少个素数。
    2. 就是考了一个素数筛选,可以将素数找出来,然后二分查找n的位置,也可以直接得出前缀和。

    二分查找

    #include <algorithm>
    #include <cstring>
    #include <stdio.h>
    #include <vector>;
    using namespace std;
    const int maxn = 1e6+100;
    bool prim[maxn];
    vector <int> ve;
    
    void get_prim() {
        prim[0] = prim[1] = true;
        for(int i=2;i<maxn;i++) {
            if(prim[i])
                continue;
            ve.push_back(i);
            for(int j=i*2;j<maxn;j+=i) {
                prim[j] = true;
            }
        }
    }
    
    int main() {
        int n;
        get_prim();
        while(scanf("%d",&n) != EOF) {
            int pos = upper_bound(ve.begin(),ve.end(),n) - ve.begin();
            if(ve[pos] > n)
                pos--;
            printf("%d
    ",pos+1);
        }
        return 0;
    }

    前缀和的代码

    #include <algorithm>
    #include <cstring>
    #include <stdio.h>
    using namespace std;
    const int maxn = 1e6+100;
    int sum[maxn];
    bool prim[maxn];
    
    void get_prim() {
        prim[1] = prim[0] = true;
        for(int i=2;i<maxn;i++) {
            if(prim[i])
                continue;
            for(int j=i*2;j<maxn;j+=i) {
                prim[j] = true;
            }
        }
    }
    
    void get_sum() {
        int cnt = 0;
        for(int i=0;i<maxn;i++) {
            if(!prim[i])
                cnt++;
            sum[i] = cnt;
        }
    }
    
    int main() {
        get_prim();
        get_sum();
        int n;
        while(scanf("%d",&n) != EOF) {
            printf("%d
    ",sum[n]);
        }
        return 0;
    }
  • 相关阅读:
    spring aop实现数据库的读写分离
    MySQL主从复制(Master-Slave)实践
    java 注解 Annontation
    java NIO介绍
    为什么你学不会递归?告别递归,谈谈我的一些经验(转)
    maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程(转)
    Eclipse中创建Maven多模块工程
    Eclipse的Working Set管理项目
    Java使用POI读取和写入Excel指南(转)
    Webpack安装和命令
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107134.html
Copyright © 2011-2022 走看看