回文素数
Description
因为101既是素数又是回文数,所以101是一个回文素数。
给出正整数a和b,请你寻找出[a, b]之间所有的回文素数。
回文数和素数的判断
Input
第一行输入两个正整数 a 和 b,中间用空格隔开,其中5 ≤ a ≤ b≤ 10000000。
Output
输出一个回文质数的列表,每行输出一个数。若没有回文质数,则输出-1。
Sample
代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
// 建立一个bool类型的数组,以下标为要判断的数字 以该下标的值为素数的标志,
// 若i是素数 则 isPrime[i]=false
static boolean[] isPrime = new boolean[10000001];
static int[] Prime = new int[10000000];//存放素数的数组
public static boolean judgePalindrome(int a){
boolean palindrome = false;
int temp = a;
int num = 0;
while(a !=0){
int b = a % 10;
a = a/10;
num = num*10 + b;
}
if(num == temp){
palindrome =true;
}
return palindrome;
}
public static void judgePrime(int b){
isPrime[0] = isPrime[1] = true;//数字0和1都不是素数,所以赋true
int t = 0;
Prime[t++] = 2;//把2放进素数表
for (int i = 2; i < b+1; i++) {
if (!isPrime[i])//若当前数是素数
Prime[t++] = i;//则存入素数数组
for (int j = 0; j < t && Prime[j] * i < b+1; j++) {
isPrime[i * Prime[j]] = true;
if (i % Prime[j] == 0)
break;//避免重筛,使得程序更有效率
}
}
}
public static ArrayList<Integer> findPalindromePrimes(int a, int b){
judgePrime(b);
ArrayList<Integer> result = new ArrayList<>();
boolean palindrome;
for(;a<=b;a++){
if(!isPrime[a]){
palindrome = judgePalindrome(a);
if(palindrome){
result.add(a);
}
}
}
if(result.isEmpty()){
result.add(-1);
}
return result;
}
public static void main(String[] args) {
try(Scanner scanner = new Scanner(System.in)){
int a = scanner.nextInt();
int b = scanner.nextInt();
ArrayList<Integer> result = findPalindromePrimes(a,b);
for(Integer i :result){
System.out.println(i);
}
}
}
}
由于有时间和空间限制,这里使用欧拉筛进行素数判断