HDU 2161 Primes

http://acm.hdu.edu.cn/showproblem.php?pid=2161

素数判断,这题数据范围小的可怜,普通的筛法肯定没问题,不过为了练习我还是拿米勒拉宾测试写的。

 ps:为2b的自己流了一地泪

View Code
#include <iostream>

using namespace std ;

__int64 qpow(int a,int b,int r)

{

    __int64 ans=1,buff=a;

    while(b)

    {

        if(b&1)ans=(ans*buff)%r;

        buff=(buff*buff)%r;

        b>>=1;

    }

    return ans;

}

bool Miller_Rabbin(int n,int a)

{

    int r=0,s=n-1,j;

    if(!(n%a))

        return false;

    while(!(s&1)){

        s>>=1;

        r++;

    }

    __int64 k=qpow(a,s,n);

    if(k==1)

        return true;

    for(j=0;j<r;j++,k=k*k%n)

        if(k==n-1)

            return true;

    return false;

}

bool IsPrime(int n)

{

    int tab[]={3,5,7};

    if(n==2||n==1||n==4)

        return false;

    for(int i=0;i<3;i++)

    {

        if(n==tab[i])

            return true;

        if(!Miller_Rabbin(n,tab[i]))

            return false;

    }

    return true;

}

int main()

{

    int n,nCase=1;

    while(scanf("%d",&n))

    {

        if(n<=0)break;

        printf("%d: ",nCase++);

        if(IsPrime(n))

            puts("yes");

        else

            puts("no");

    }

    return 0;

} 

 

你可能感兴趣的:(Prim)