昨天也刷了一道关于质数的题,今天来补个刀,题目是这样的:
因为质数没有回文数多,我就采用了先生成回文数再判断质数的方法;
生成回文数:
为了避免TLE,先掌握以下几个关于质数的性质,用于缩小范围:
1.偶数不是素数
2.有偶数位的回文数(除了11)必然不是质数;
因为它必然是11的倍数
注意到题目所给的数据范围是一亿(八位数,因为一亿不是素数),所以需要生成的区间就是1位/3位/5位/7位(别忘了11),下面是生成回文数的代码段:
int pali[] = new int[1000000];//回文数组
pali[0] = 5; pali[1] = 7;pali[2] = 11;//一位,两位
int count=3;
for(int d1 = 1;d1 <= 9;d1+=2) {//三位
for(int d2 = 0;d2 <= 9;d2 ++) {
pali[count] = d1*100 + d2*10 + d1;
count ++;
}
}
for(int d1 = 1;d1 <= 9;d1+=2) {//五位
for(int d2 = 0;d2 <= 9;d2++) {
for(int d3 = 0;d3 <= 9;d3 ++) {
pali[count] = d1*10000 + d2*1000 + d3*100 + d2*10 +d1;
count ++;
}
}
}
for(int d1 = 1;d1 <= 9;d1+=2) {//七位
for(int d2 = 0;d2 <= 9;d2++) {
for(int d3 = 0;d3 <= 9;d3 ++) {
for(int d4 = 0;d4 <= 9;d4 ++) {
pali[count] = d1*1000000 + d2*100000 + d3*10000 + d4*1000 + d3*100 + d2*10 +d1;
count ++;
}
}
}
}
这样回文数组就生成好了
判断质数
因为给了完整的区间,所以只需要同时满足pali[i]在a和b之间即可;
这是判断质数代码块:
//根据a,b范围判断质数
for(int i=0;i < count;i++) {
if(a <= pali[i] && b >= pali[i]) {//则开始判断pali[i]是否是质数
if(isPrime(pali[i])) System.out.println(pali[i]);
}
}
另附判断质数函数isPrime():
static boolean isPrime(int n) {
for(int k=2; k<=Math.sqrt(n); k++) {
if(n % k == 0)return false;
}
return true;
}
AC通过 撒花
下面是完整代码:
package P1217回文质数;
import java.util.*;
public class Main {
static boolean isPrime(int n) {
for(int k=2; k<=Math.sqrt(n); k++) {
if(n % k == 0)return false;
}
return true;
}
public static void main(String[] args) {
//录入a,b
Scanner in = new Scanner(System.in);
int a,b;
a = in.nextInt();b=in.nextInt();
//生成a-b之间的回文数
int pali[] = new int[1000000];//回文数组
pali[0] = 5; pali[1] = 7;pali[2] = 11;//一位,两位
int count=3;
for(int d1 = 1;d1 <= 9;d1+=2) {//三位
for(int d2 = 0;d2 <= 9;d2 ++) {
pali[count] = d1*100 + d2*10 + d1;
count ++;
}
}
for(int d1 = 1;d1 <= 9;d1+=2) {//五位
for(int d2 = 0;d2 <= 9;d2++) {
for(int d3 = 0;d3 <= 9;d3 ++) {
pali[count] = d1*10000 + d2*1000 + d3*100 + d2*10 +d1;
count ++;
}
}
}
for(int d1 = 1;d1 <= 9;d1+=2) {//七位
for(int d2 = 0;d2 <= 9;d2++) {
for(int d3 = 0;d3 <= 9;d3 ++) {
for(int d4 = 0;d4 <= 9;d4 ++) {
pali[count] = d1*1000000 + d2*100000 + d3*10000 + d4*1000 + d3*100 + d2*10 +d1;
count ++;
}
}
}
}
//根据a,b范围判断质数
for(int i=0;i < count;i++) {
if(a <= pali[i] && b >= pali[i]) {//则开始判断pali[i]是否是质数
if(isPrime(pali[i])) System.out.println(pali[i]);
}
}
}
}