• 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;
    }
  • 相关阅读:
    Kubernetes对象之Pod
    docker&k8s填坑记
    kubernetes安装过程中遇到问题及解决
    深入JVM-垃圾回收概念与算法
    深入JVM-常用Java虚拟机参数
    深入JVM-java虚拟机的基本结构
    从Paxos到ZooKeeper-三、ZooKeeper的典型应用场景
    从Paxos到ZooKeeper-二、ZooKeeper和Paxos
    从Paxos到ZooKeeper-一、分布式架构
    java编程思想-java中的并发(四)
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107134.html
Copyright © 2020-2023  润新知