pat 1015

来源:互联网 发布:安卓好的看书软件 编辑:程序博客网 时间:2024/05/21 16:55

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 intreverse(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 intreverse(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");}elseprintf("No\n"); }elseprintf("No\n");}}} /**73 1023 223 100 2-2 31 2*/

5、题目坑点

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

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

6、总结

(1)先想清楚自己要干什么,再动手写代码



0 0