这道题我用枚举搜索,比如说要求出150到50000之间的所有Prime Palindromes,那么就枚举所有长度等于3和5的回文,然后判断这个回文是否为素数,注意一点,成都为偶数的回文一定能整除11,所以程度为偶数的回文只有11是素数,因此我们只需要判断长度为基数的回文。
那么如何枚举出长度为5的所有回文呢?
可以对回文的左边3个数字进行枚举,如左边3个数字为100,那么回文就是10001,然后左边3个数字为101,回文就是10101,等等,直到左边3个数字为999.对应的回文为99999
要注意一点,范围要求是100000000以下,如果出现100000000这个数字是不需要枚举长度为9的回文的,否则最后一个数据会超时!
如果能够增加判断一个数是否为素数的速度,那么程序速度将会快很多!

/**//*
ID: sdjllyh1
PROG: pprime
LANG: JAVA
complete date: 2008/11/23
author: LiuYongHui From GuiZhou University Of China
more article: www.cnblogs.com/sdjls
*/
import java.io.*;
import java.util.*;
public class pprime

{
private static int a, b;
private static int a_length, b_length;
private static int[] answers = new int[1000];
private static int ansCount = 0;//记录有多少个答案
public static void main(String[] args) throws IOException
{
init();
run();
output();
System.exit(0);
}
private static void run()
{
//pL = palindromeLength
for (int pL = a_length; pL <= b_length; pL++)
{
//如果我们要求的回文长度为奇数
//(当长度为5时,回文的左边3个字母分别从100一直循环到999,也就是说枚举的回文分别为10001,10101,10201……直到99999)
if ((pL % 2 == 1) && (pL < 9))
{
int left = 1;//left表示回文的左边(包含正中间的那个数字)
//计算回文左边的起始数字(当长度为5时,left=100)
for (int i = 0; i < pL / 2; i++)
{
left = left * 10;
}
//保留第一个数字的10倍,一会有用
int left10 = left * 10;
//当left的长度不增加时(当长度为5时,即left从100到999)
while (left < left10)
{
//得到完整的回文(当left等于123时得到的palindrome为12321,注意回文的长度是奇数)
int palindrome = makePalindrome(left);
//如果这个回文是素数
if (isPrime(palindrome))
{
//如果在要求范围内
if ((palindrome >= a) && (palindrome <= b))
{
//增加这个答案
answers[ansCount] = palindrome;
ansCount++;
}
}
left++;
}
}
else //否则长度为偶数,长度为偶数的回文一定能整除11,因此不会是素数(除了11)
{
if ((pL == 2) && (a <= 11))
{
answers[ansCount] = 11;
ansCount++;
}
}
}
}
//用value(左半部份)生成回文,如12345可以生成123454321
private static int makePalindrome(int value)
{
int retValue = value;
value /= 10;
while (value > 0)
{
retValue = retValue * 10 + value % 10;
value /= 10;
}
return retValue;
}
//判断value是否为素数
private static boolean isPrime(int value)
{
int s = (int)Math.sqrt(value);
for (int i = 2; i <= s; i++)
{
if (value % i == 0)
{
return false;
}
}
return true;
}
private static void init() throws IOException
{
BufferedReader f = new BufferedReader(new FileReader("pprime.in"));
StringTokenizer st = new StringTokenizer(f.readLine());
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
a_length = String.valueOf(a).length();
b_length = String.valueOf(b).length();
f.close();
}
private static void output() throws IOException
{
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("pprime.out")));
for (int i = 0; i < ansCount; i++)
{
out.println(answers[i]);
}
out.close();
}
}
浙公网安备 33010602011771号