• 复习基础素数


    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #define maxn 100009
    using namespace std;
    typedef long long ll;
    int check_prime(int x)// 普通的素数判定 这里的最简单的优化就是sqrt(x)范围的缩小 假设有一个数b n能整除b 那么就有n/b存在 那什么时候因数最大呢 当n/b=b的时候 也就是sqrt(n)的时候
    {
        if(x==1) return 0;
        for(int i=2;i<=sqrt(x);i++)
        {
            if(x%i==0) return 0;
        }
        return 1;
    }
    int is_prime[maxn],prim[maxn];
    int sieve_prime(int n)// 素数筛法 整数倍的筛去
    {
        int ret=0;
        fill(is_prime+2,is_prime+n+1,1);//
        for(int i=2;i<=n;i++)
        {
            if(is_prime[i])
            {
                prim[ret++]=i;
                for(int j=i*2;j<=n;j+=i) is_prime[i]=0;
            }
        }
        return ret;
    }
    ll Is_prime[maxn],Is_primesmall[maxn];

    // 对[a,b)这个区间求素数的个数,当a,b的范围都很大的时候,就需要一些改良了 我们知道小于b的合数的最大因子在sqrt[b]之内 那我们做一个2~sqrt(b)的表 在筛选这个表的同时 把[a,b)区间的合数也一并筛掉 那么[a,b)剩下的就是素数了 // [2,b]这个区间可以sieve [2,b*b]内的合数
    void segement_sieve(ll a,ll b)// 大区间的素数筛法 { for(int i=0;(ll)i*i<b;i++) Is_primesmall[i]=1; for(int i=0;i<b-a;i++) Is_prime[maxn]=1; for(int i=2;(ll)i*i<b;i++) { if(Is_primesmall[i]) { for(int j=i*2;(ll)j*j<b;j++) Is_primesmall[j]=0;// 由于b是ll类型 所以这里用 (ll)j*j<b 来代替j<sqrt(b) for(ll j=max(2LL,(a+i-1)/i)*i;j<=b;j+=i) Is_prime[j-a]=0;// 由于数据太大 这里用j-a哈希一下 // 慢慢的细节, 数字后面加LL是为了保证类型一致 max(2LL,(a+i-1)/i)用来求i最接近a的倍数,最小是两倍 牛逼 } } } int main() { int n; cin>>n; while(n--) { int x; cin>>x; if(check_prime(x)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
  • 相关阅读:
    java基础 IO流
    删除API
    Get API
    Document APIs
    使用Java High Level REST Client操作elasticsearch
    Azure 上的物联网产品介绍
    SSIS Passing Parameters to an ADO .NET Source query;向ado.net数据源传递参数。
    Azure API Management(5)缓存
    Azure API Management(6)Validate JWT Token
    Azure API Management(4)体验APIM 版本管理
  • 原文地址:https://www.cnblogs.com/z1141000271/p/6544740.html
Copyright © 2020-2023  润新知