1015. Reversible Primes (20)

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

 
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <set>
#include <stack>
#include <iterator>
using namespace std ;

#define N 1005
#define INF  999999

bool isPrime(int n)
{
  int i ;
  if(n == 1)
    return false ;
  if(n == 2)
    return true ;
  for(i = 2 ;i*i <= n ; i++)
  {
    if(n % i == 0)
      return false ;
  }
  return true ;
}

bool getNum(int num , int d)
{
  vector<int > v ;
  int sums = 0 ;
  int fa = 1  ;
  while(num != 0)
  {
    int yushu = num % d  ;
    num /= d ;
    sums += yushu * fa ;
    fa *= d ;
    v.push_back(yushu) ;
  }
  if(!isPrime(sums))
    return false ;
  sums = 0 ;
  fa = 1 ;
  int len = v.size() ;
  for(int i = len - 1 ; i >= 0 ; i--)
  {
    int yushu = v[i] ;
    sums += yushu * fa ;
    fa *= d ;
  }
  if(!isPrime(sums))
    return false ;
  return true ;
}

int main()
{
  //freopen("in.txt","r",stdin);
  int n  , d;
  while( scanf("%d",&n) != EOF)
  {
    if(n < 0)
      break ;
    scanf("%d",&d);
    if(getNum(n , d))
    {
      printf("Yes\n") ;
    }else{
      printf("No\n") ;
    }
  }
  return 0 ;
}

你可能感兴趣的:(1015. Reversible Primes (20))