PAT (Advanced Level) Practise 1031
1015. Reversible Primes (20)
A reversible prime in any number system is a prime whose “reverse” in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime.
Now given any two positive integers N (< 105) and D (1 < D <= 10), you are supposed to tell if N is a reversible prime with radix D.
Input Specification:
The input file consists of several test cases. Each case occupies a line which contains two integers N and D. The input is finished by a negative N.
Output Specification:
For each test case, print in one line “Yes” if N is a reversible prime with radix D, or “No” if not.
Sample Input:
73 10
23 2
23 10
-2
Sample Output:
Yes
Yes
No
思路
题目的意思是给出一个数N,和进制radix,首先判断N是不是素数,如果是,在将其转换为radix进制,并取逆序得到rev_num,再判断rev_num是不是素数,如果是,则为reversible prime,否则不是.
编程实现
#include <stdio.h>
#include <math.h>
typedef enum {false, true} bool;
bool prime(int num)
{
int i, upper;
bool is_prime = true;
if ( num < 2 )
return false;
upper = (int)sqrt((double)num)+1;
/* 注意i<=upper会导致num==2时,出现错误 */
for ( i = 2; i < upper; i++ ) {
if ( num % i == 0 ) {
is_prime = false;
break;
}
}
return is_prime;
}
int reverse(int key, int radix)
{
int revs = 0;
while ( key ) {
revs = revs*radix + (key % radix);
key /= radix;
}
return revs;
}
int main(void)
{
int num, radix;
while ( true ) {
scanf("%d", &num);
if ( num < 0 ) break;
scanf("%d", &radix);
if ( (!prime(num)) ||
(!prime(reverse(num, radix))) )
printf("No\n");
else
printf("Yes\n");
}
return 0;
}