UVA10006 - Carmichael Numbers

题目链接:UVA10006

本来想直接打素数表,然后根据素数表来判断,结果一直超时,后来把素数表去掉,再在for循环中加判断才勉强过了。

Some numbers that are not prime still pass the Fermat test with every number smaller than themselves. These numbers are called Carmichael numbers.

只要按着这两个条件判断即可。

具体看代码:

 

#include<iostream>

#include<cmath>

#include<cstdlib>

using namespace std;

bool isPrimer(int num);

int powerMode(int,int,int);

//bool primeTable[65010];

int main()

{

//    for(int i=1;i<=65010;i++)

//        if(isPrimer(i))

//            primeTable[i]=1;   //素数标为1

//        else

//            primeTable[i]=0;

    int number;

    while(cin>>number,number!=0)

    {

        bool flag=0;

        //  not prime

        if(isPrimer(number))

            flag=1;

        // pass the Fermat test with every

        // number  smaller than themselves.

        //Let a be a random number between 2 and n - 1

        for(int i=2;(i<number)&&!flag;i++)

            if(powerMode(i,number,number)!=i)

                flag=1;



        if(flag)

            cout<<number<<" is normal."<<endl;

        else

            cout<<"The number "<<number<<" is a Carmichael number."<<endl;

    }

    return 0;

}

bool isPrimer(int number)

{

    if(number<=2)

        return true;

    if(number%2==0)

        return false;

    for(int i=3;i<=ceil(sqrt(number));i++)

        if(number%i==0)

            return false;

    return true;

}

//计算 pow(a,n)%n=a

int powerMode(int a,int n,int mode)

{

    long long  answer=1;

    while(n)

    {

        if(n&1)  

            answer=(answer*a)%mode;

        a=((long long )a*a)%mode;

        n=n>>1;

    }

    return answer;

}


 


 

你可能感兴趣的:(number)