您的位置:首页 > 其它

pat 1015

2017-01-18 13:35 246 查看
1、题目链接

2、题意分析

(1)题意:给出一个数字N,并且给出一个进制radix,请你判断,这个数字N,以及这个数字在进制radix下的反转数是否都为素数?

(2)分析:我们需要三个函数来完成上述的功能(包含main()函数)。第一个是isPrime()函数,用来判断是否为素数;第二个是将当前的数在进制radix中转换成反转数,然后再转换成十进制的数,我称之为reverse()函数;第三个是main()函数,作为程序的入口。

3、关于如何判断是否为素数,这在之前我已经谈及过,这里不再做介绍,直接给出代码如下:

//判断一个数是否为素数
bool isPrime(int total){
if(total < 2){//如果是2,则直接返回true
return true;
int i ;
for(i = 2;i <= (int)sqrt(1.0 * total);i++){//素数判断从2开始
if(total % i == 0){
return false;//返回false
}
}
return true;//这里直接的返回包含了total = 2的情况【重要!!】
}
再实现反转函数,如下:
//在当前radix进制反转后,转换成十进制数total
int reverse(int a ,int radix){//a为数,radix为进制
int total = 0 ,i = 0 ,j ;
int array[size];
while(a!=0){//为了得到各位上的数 ---> 需要除以10
array[i++] = a % radix;
a /= radix;
}
for(j = 0;j < i;j++){
total = total * radix + array[j];
}
//printf("反转后 = %d\n",total);
return total;
}
4、源代码
#include <stdio.h>
#include <math.h>

#define size 100//6位足够

/*
1.如果一个数是素数,那么无论在什么进制下都是素数!
*/

//在当前radix进制反转后,转换成十进制数total
int reverse(int a ,int radix){//a为数,radix为进制
int total = 0 ,i = 0 ,j ;
int array[size];
while(a!=0){//为了得到各位上的数 ---> 需要除以10
array[i++] = a % radix;
a /= radix;
}
for(j = 0;j < i;j++){
total = total * radix + array[j];
}
//printf("反转后 = %d\n",total);
return total;
}

//判断一个数是否为素数
bool isPrime(int total){
if(total < 2){//如果是0,1,2,则直接返回true
return false;
}
int i ;
for(i = 2;i <= (int)sqrt(1.0 * total);i++){//素数判断从2开始
if(total % i == 0){
return false;//返回false
}
}
return true;
}

int main(){
int number;
int radix;
while(scanf("%d %d",&number,&radix) == 2 ){
if(number < 0){
break;
}
if(number == 1 || number == 0){
printf("No\n");
}
else{
if(isPrime(number)){
int total2 = reverse(number,radix);
if(isPrime(total2)){
printf("Yes\n");
}
else
printf("No\n");
}
else
printf("No\n");
}
}
}
/**
73 10
23 2
23 10
0 2
-2 3
1 2
*/

5、题目坑点
(1)需要注意输入1 2的时候输出是No,因为1不是素数。【重要!!】在判断素数的时候,需要使用if(total <= 1)另加判断一次。

(2)需要注意一些特殊数字,例如,有一些数字本身是素数,反转之后,就变成了1,这是就不是素数了。这一点对应pat测试点2。

6、总结

(1)先想清楚自己要干什么,再动手写代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: