PAT 1015 素数判断
首先,按照素数的定义,假如该数模任意一个比它小的大于1的正整数都不等于0,则该数为素数,这是定义法。
进一步地,根据素数成对出现的特征,只需判断[2,sqrt(n)]的因数即可,这是定义法的改进。
还有一种技巧,我们知道任何一个数都可以表示成6x+n的形式,其中n等于0,2,3,4等数时,一定不是素数,那只有n等于1,5的时候才有可能,这时候再用改进定义法判断即可,这是素数筛法。注意n小于6要单独列举。
还有一种改进的素数筛,这里太复杂就没研究。
本题两个注意点:所给的十进制数不一定是素数;1既不是素数也不是合数,所以不是素数。
代码:
#include <iostream>
#include <cmath>
using namespace std;
int N,radix;
bool isPrime(int n){
if(n==2||n==3||n==5) return true;
if(n==1) return false;
if(n%6==1||n%6==5){
for(int i = 2;i <= sqrt(n);i++){
if(n%i==0) return false;
}
return true;
}
return false;
}
int main(){
while(true){
cin>>N;
int n = 0,i = 1;
int num[1000];
if(N < 0) break;
cin>>radix;
int copy = N;
while (N != 0) {
num[i] = N%radix;
N /= radix;
i++;
}
num[0] = i-1;
for(int j = 1;j <= num[0];j++){
n *= radix;
n += num[j];
}
if(isPrime(n) && isPrime(copy)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
5ms