[结题报告]10235 - Simply Emirp Time limit: 3.000 seconds
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
17 18 19 179 199
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; }