Problem G: Simply Emirp |
An integer greater than 1 is called a prime number if its only positive divisors (factors) are 1 and itself. Prime numbers have been studied over the years by a lot of mathematicians. Applications of prime numbers arise in Cryptography and Coding Theory among others.
Have you tried reversing a prime ? For most primes, you get a composite (43 becomes 34). An Emirp (Prime spelt backwards) is a Prime that gives you a different Prime when its digits are reversed. For example, 17 is Emirp because 17 as well as 71 are Prime. In this problem, you have to decide whether a number N is Non-prime or Prime or Emirp. Assume that 1< N< 1000000.
Interestingly, Emirps are not new to NTU students. We have been boarding 199 and 179 buses for quite a long time!
Input
Input consists of several lines specifying values for N.
Output
For each N given in the input, output should contain one of the following:
1. "N is not prime.", if N is not a Prime number. 2. "N is prime.", if N is Prime and N is not Emirp. 3. "N is emirp.", if N is Emirp.
Sample Input
171819179199
Sample Output
17 is emirp.18 is not prime.19 is prime.179 is emirp.199 is emirp. 参考代码: 此题主要是讲判断一个数是否为质数,和其倒过来的数是否为质数,思路并不难想,只要掌握数倒置,如何让判断质数即可.先求出倒置的数,然后分别判断是否为质数,最后判断输出.
#include"stdio.h"#include"math.h"#include"stdlib.h"long fun1(long n) //判断是否为质数 { long t,m; m=(long)sqrt(n); for(t=2;t<=m;t++) if(n%t==0) return 0; return 1; }long fun2(long s) //将数倒置 { char a[2000]; int i=0; while(s>0) { a[i]=s%10+48; s/=10; i++;} a[i]='\0'; s=atol(a); return s; }int main(void){ long n,m,flag1,flag2,flag3; while(scanf("%ld",&n)!=EOF) {flag1=0;flag2=0;flag3=0; m=fun2(n); flag1=fun1(n); flag2=fun1(m); if(m!=n) flag3=1; if(flag1==1&&flag2==1&&flag3==1) printf("%ld is emirp.\n",n); else if(flag1==1) printf("%ld is prime.\n",n); else if(flag1==0) printf("%ld is not prime.\n",n); }return 0; }