质数

Author Avatar
Axell 8月 14, 2018
  • 在其它设备中阅读本文章

质数

判断质数

    bool check(int i){
        for (int j=2;j<=int(sqrt(i));++j){
            if (i % j == 0) return false;
        }
        return true;
    }

筛法求素数【高效】

适用于判断很多数是不是质数,但不适用于数字很大的情况

欧拉筛法

bool IsPrime[7100];
int Prim[7100];
void euler_prime(int n){
    int j;
    for(int i=2;i<=n;i++){
        if(!IsPrime[i])
            Prim[++num]=i;
        for(j=1;j<=num;j++){
            if(i*Prim[j]>n)
                break;
            IsPrime[i*Prim[j]]=1;
            if(i%Prim[j] == 0)
                break;
        }
    }
}

埃拉特斯特尼筛法

    #include <bits/stdc++.h>
    using namespace std;

    const long long maxn = 10000007 + 10;
    const long long maxp = 700000;
    int vis[maxn];    // i是合数vis为1,i是素数,vis为0
    long long prime[maxp];

    void sieve(long long n){
        long long m = (long long)sqrt(n + 0.5);
        memset(vis, 0, sizeof(vis));
        vis[2] = 0;
        for (long long i = 3; i <= m; i += 2) {
            if(!vis[i])
                for (long long j = i * i; j <= n; j += i)
                    vis[j] = 1;
            if(i * i > n)
                break;
        }
    }

    long long gen(long long n){
        sieve(n);
        long long c = 1;
        prime[0] = 2;
        for (long long i = 3; i <= n; i += 2)
            if(!vis[i])
                prime[c++] = i;
        return c;
    }

    int main()
    {
        long long n, c;
        cin >> n;
        c = gen(n);
        for (long long i = 0; i < c; i++)
            printf("%lld", prime[i]);
        cout << endl << c;
        return 0;
    }

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

本文链接:https://hs-blog.axell.top/archives/24/