Friday, February 18, 2011

10235 - Simply Emirp


#include <stdio.h>
#include <math.h>
#define M 1000000
#define MH M/2

char prm[M/16+10];
int reverse(int);
int isPrime(int);
void seive();

int main()
{
    int n,r;
    //freopen("in.txt","r",stdin);

    seive();

    while(scanf("%d",&n)==1)
    {
        if(isPrime(n))
        {
            r=reverse(n);
            if((r^n)&&isPrime(r))
                printf("%d is emirp.\n",n);
            else
                printf("%d is prime.\n",n);
        }
        else
            printf("%d is not prime.\n",n);
    }
    return 0;
}

void seive()
{
    int lim = (int)sqrt(M),i,j;
    for ( i = 3; i <= lim; i += 2){
        if ( !(prm[i>>4]&(1<<((i>>1)&0x7))) )
        {
            for (j = i*i/2; j <= MH; j+=i) prm[j>>3] |= (1<<(j&0x7));
        }
    }
}

int isPrime(int n)
{
    if ( n < 2) return 0;
    if ( n == 2) return 1;
    if ( n%2 == 0) return 0;
    if ( !(prm[n>>4]&(1<<( (n>>1)&0x7))) ) return 1;
    return 0;
}

int reverse(int n)
{
    int r=0;
    while(n)
    {
        r=r*10+n%10;
        n=n/10;
    }
    return r;
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.