1015. Reversible Primes (20)
时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue
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 -2Sample Output:
Yes Yes No
只通过第一个测试点,先备份,暂时没有找到好的解决方法 ,不过复习了一下 reverse ,isPrime方法的实现,
isPrime方法可以将for 循环的取值范围缩减到 sqrt( x) 来判断 x 是否是素数。
reverse 这个地方, 通常在以前实现代码的时候,都是将一个 int 型的数字转化为 char 类型的,
不过在这个地方,没有经过中间步骤的转化。
对于getNumber 这个方法, 是将传入的数字根据它的数字和数字的基数求取实际的数据。
我在这个地方有一点点的怀疑就是 , 23 2 如果是将 23 转换成以基数 2 ,也就是2进制表示的数值 为 7 ,则满足题意,故输出 Yes
但是在之前做题的时候,对于一个进制 为 X 的数值,它的表示数值最多不会超过 X-1 。所以决定试验一下 23-> 2进制: 10111,结果并不会输出Yes。
故放弃这种想法。
#include <cmath> #include <cstdio> #include <cstdlib> int Num1 , Num2 , r; void reverse( ) { int temp [100001] , t = Num1 ; int len = 0 ; while ( t ) { temp[len++] = t%10 ; t /= 10 ; } t = 0 ; for ( int i = 0 ; i < len ; i++ ) { t += (int )pow(10 , len -1- i)* temp[i] ; } Num2 = t ; } bool isPrime( int x ) { int i ; for ( i = 2 ; i <x ; i++ ) { if ( x % i == 0) { break ; } } if ( i == x ) { return true ; } return false ; } int getNumber( int x , int r ) { int result = 0 , count = 0 ; while(x) { result += (x%10)*(int)pow(r ,count ) ; x /= 10 ; count++ ; } return result ; } bool input() { while(~scanf("%d", &Num1) ) { if ( Num1 >= 0 ) { scanf("%d", &r ) ; Num1 = getNumber(Num1 , r ) ; reverse() ; if (isPrime(Num1) && isPrime(Num2)) { printf("Yes\n") ; } else { printf("No\n") ; } return true ; } else { return false ; } } } int main ( void ) { while( input() ); return 0 ; }