筛质数

题目描述

给定一个正整数n,请你求出1~n中质数的个数。

输入

共一行,包含整数n。

输出

共一行,包含一个整数,表示1~n中质数的个数。

样例输入 Copy

8

样例输出 Copy

4

提示

1 ≤ n ≤ 1e6

朴素筛法

#include<iostream>
using namespace std;

const int N = 1e6 + 20;
int cnt;
bool st[N];

void is_ji(int n)
{
    for (int i = 2; i <= n; i++)
    {
        if (st[i]) continue;
        cnt ++;
        for (int j = i + i; j <= n; j += i)
            st[j] = true;
    }
}

int main()
{
    int n;
    cin >> n;

    is_ji(n);
    cout << cnt << endl;

    return 0;
}

线性筛法

#include<iostream>
using namespace std;

const int N = 1e6 + 20;
int cnt, p[N];
bool st[N];

void is_ji(int n)
{
    for (int i = 2; i <= n; i++)
    {
        if (!st[i]) p[cnt++] = i;
        for (int j = 0; p[j] * i <= n; j++)
        {
            st[p[j] * i] = true;
            
            if (i % p[j] == 0) break;
        }
    }
}

int main()
{
    int n;
    cin >> n;

    is_ji(n);
    cout << cnt << endl;

    return 0;
}

 

posted @ 2022-03-01 19:35  ora12321  阅读(8)  评论(0)    收藏  举报