题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 a,b[a,b] (5 \le a < b \le 100,000,000)a,b( 一亿)间的所有回文质数。
输入格式 第 1 行: 二个整数 a 和 b .
输出格式 输出一个回文质数的列表,一行一个。
输入
5 500
输出
5
7
11
101
131
151
181
191
313
353
373
383
题目中的数据量较大,如果直接用暴力破解的方式肯定会超时,所以因该先找出题目中的质数或回文数字,将这些数据 放在一个数组了里,直接再这个数组里找到回文质数
判断数据的位数找回文数字
public static boolean show(int n) {//判断是否是质数
for(int i=2;i<=Math.sqrt(n);i++) {
if(n%i==0)return false;
}
return true;
}
public static int huiwen(int n) {//位数为偶数
int m=num(n);
int x=n;
int s=0;
int []arr=new int[2*num(n)];
for(int i=m-1;i>=0;i--) {
arr[i]=n%10;
n=n/10;
}
for(int i=m;i<2*m;i++) {
arr[i]=arr[2*m-i-1];
}
for(int i=0;i<2*m;i++) {
s=(int) (arr[i]*Math.pow(10, i))+s;
}
return s;
}
public static int hui(int n) {//位数为奇数时
int m=num(n);
int x=n;
int s=0;
int []arr=new int[2*num(n)];
for(int i=m-1;i>=0;i--) {
arr[i]=n%10;
n=n/10;
}
for(int i=m;i<2*m-1;i++) {
arr[i]=arr[2*m-i-2];
}
for(int i=0;i<2*m-1;i++) {
s=(int) (arr[i]*Math.pow(10, i))+s;
}
return s;
}
下面是判断质数的代码
public static boolean show(int n) {//判断是否是质数
for(int i=2;i<=Math.sqrt(n);i++) {
if(n%i==0)return false;
}
return true;
}
主函数
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt();
int []arr = new int [20000];
int x=0;
for(int j=5;j<10000;j++) {
arr[x]=huiwen(j);
x++;
arr[x]=hui(j);
x++;
}
for(int i=0;i<20000;i++) {
if(arr[i]>=m&&arr[i]<=n) {
if(show(arr[i])) {
System.out.println(arr[i]);
}
}
}
}