• 素数筛选


    简单的引入一下欧拉函数



    素数筛选知道4种,暴力筛(逐个判断),埃拉特斯特尼筛 ,欧拉线性筛 ,一个大于5的素数一定在6的倍数周围(PS:不知道官方名是什么)


    埃拉特斯特尼筛法。时间复杂度为O(n loglog n)

    //倍数筛除 时间复杂度(o(nloglogn)
    //一个素数的倍数一定不是素数
    int vis[1000] , prime[1000];
    void judge()
    {
        memset(vis,1,sizeof(vis));
        int cnt=0;
        prime[0] = prime[1] = 0;
        for(int i=2;i<1000;i++)
        {
            if(vis[i])
            {
                prime[cnt++] = i;  //cout<<prime[cnt-1]<<endl;
                for(int j=i*i;j<1000;j+=i)
                    vis[j] = 0;
            }
        }
        
    }

    欧拉线性筛法 时间复杂度(o(n) )

    //欧拉线性筛法 时间复杂度(o(n))
    const int MAXN=3000001;
    int prime[MAXN];//保存素数
    bool vis[MAXN];//初始化
    void Prime(int n)
    {
        int cnt=0;
        memset(vis,1,sizeof(vis));
        for(int i=2;i<=n;i++)
        {
            if(vis[i]) { prime[cnt++] = i; /* cout<<prime[cnt-1]<<endl;  */ }
            for(int j=0 ; j<cnt && i*prime[j]<n;j++)
            {   //  i*prime[j]<=n  容易将最后一个筛出
                vis[ i*prime[j] ] = 0;
                if(i%prime[j]==0) break;//避免重复筛
            }
        }
        cout<<cnt<<endl;
    }

    一个大于5的素数一定在6的倍数周围

    //一个大于5的素数一定在6的倍数周围(时间复杂度小于sqrt(n))
    // 判断素数  
    typedef long long ll;
    ll n,m;
    ll prime(ll n)
    {
        if(n < 2)return 0;
        if(n ==2 || n == 3)return 1;
        if(n % 6 != 1 && n % 6 != 5)return 0;
        for(ll i = 5; i * i <= n; i += 6)
        {
            if(n % i == 0 || n % (i + 2) == 0)
            return 0;
        }
        return 1;
    }

    证明:


    所遇皆星河
  • 相关阅读:
    Source Insight的一些使用技巧
    ADS中Image$$RO$$Limit的计算
    JQuery 对 Select option 的操作
    设计模式: 细节[装饰模式]
    ObjectContext 实例已释放,不可再用于需要连接的操作
    关于一个多线程面试题的理解
    [Head First]第三章:装饰模式
    [Head First]第一章:策略模式
    MVC4 DropDownListFor的问题
    如何调试MVC4的代码
  • 原文地址:https://www.cnblogs.com/Shallow-dream/p/11429071.html
Copyright © 2020-2023  润新知