zoukankan      html  css  js  c++  java
  • 有关判断素数

    最近新学习了一个神奇的判断素数的方法

    已知:大于等于5的质数一定和6的倍数相邻
    证明:令x≥1,将大于等于5的自然数表示如下:······6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······ 可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。这里要注意的一点是,在6的倍数相邻两侧并不是一定就是质数。根据以上规律,判断质数可以6个为单元快进,即循环中i+=6,加快判断速度
    证毕

    最后小于5的特殊处理,大于6的在循环中枚举着判断

    跑贼快

    当然如果测试组数实在太多可能还是欧拉筛或者杜教筛、埃拉托色尼筛要更快一些

    //反正luogu那道素数筛模板这种方法是可以168ms过的,另外几种最快的也要1000+

    #include <cmath>
    #include <cstdio>
    inline int read()
    {
        int n=0,w=1;register char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
        while(c>='0'&&c<='9')n=n*10+c-'0',c=getchar();
        return n*w;
    }
    inline bool check(int x)
    {
        if(x==2||x==3)return true;
        if(x==1||(x%6!=1&&x%6!=5))return false;
        int y=sqrt(x);
        for(int i=5;i<=y;i+=6)
            if(!(x%i)||!(x%(i+2)))
                return false;
        return true;
    }
    int main()
    {
        int n,m;
        n=read(),m=read();
        while(m--)
        {
            n=read();
            if(check(n))
                printf("Yes
    ");
            else    printf("No
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    [转]C# 常用字符串加密解密方法
    ADO.net商机题目
    ADO.net属性拓展
    实体类,数据访问类应用
    实体类,数据访问类.字符串攻击.防攻击
    ADO.net增删改的应用
    ADO.net增删改查
    css——层叠样式表
    标题栏小图标、锚点、滚动效果、视频插入、音乐插入
    HTML——超文本标记语言(表单及12个表单元素)
  • 原文地址:https://www.cnblogs.com/kuaileyongheng/p/8674227.html
Copyright © 2011-2022 走看看