pat1015_错题备份

19 篇文章 0 订阅

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
-2
Sample 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 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值