根据回文数的特性可以写出
public static boolean hui(int p) {
char[] s=(p+"").toCharArray();
int l=s.length;
for (int i = 0; i < l/2; i++) {
if (s[i]!=s[l-i-1]) {
return false;
}
}
return true;
}
根据素数的特性又可以写出
public static boolean su(int p) {
if (p<2) {
return false;
}
if (p%2==0) {
return false;
}
if (p>9&&(p%5==0||p%7==0||p%11==0||p%13==0||p%17==0||p%19==0)) {
return false;
}
for (int i = 3; i*i <= p; i++) {
if (p%i==0) {
return false;
}
}
return true;
}
这是可以写出的程序是这样的
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt(),b=scanner.nextInt();
for (int i = a; i <=b; i++) {
if (hui(i)&&su(i)) {
System.out.println(i);
}
}
}
public static boolean hui(int p) {
char[] s=(p+"").toCharArray();
int l=s.length;
for (int i = 0; i < l/2; i++) {
if (s[i]!=s[l-i-1]) {
return false;
}
}
return true;
}
public static boolean su(int p) {
if (p<2) {
return false;
}
if (p%2==0) {
return false;
}
for (int i = 3; i*i <= p; i++) {
if (p%i==0) {
return false;
}
}
return true;
}
}
这时发现最后一个测试点无法通过
我自然想到io流输出的方法来尝试优化
package 算法训练;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class 回文质数 {
static BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt(),b=scanner.nextInt();
for (int i = a; i <=b; i++) {
if (hui(i)&&su(i)) {
out.write(i+"\n");
}
}
out.flush();
}
public static boolean hui(int p) {
char[] s=(p+"").toCharArray();
int l=s.length;
for (int i = 0; i < l/2; i++) {
if (s[i]!=s[l-i-1]) {
return false;
}
}
return true;
}
public static boolean su(int p) {
if (p<2) {
return false;
}
if (p%2==0) {
return false;
}
for (int i = 3; i*i <= p; i++) {
if (p%i==0) {
return false;
}
}
return true;
}
}
但貌似因为这题输出的数据量不是很大
所以效果甚微
这时我在想各种方法尝试去优化
但效果依然不太理想
然后我猛然看见它的输出数据
最后几行
9931399
9932399
9935399
9938399
9957599
9965699
9978799
9980899
9981899
9989899
!!!!!
竟然在1千万到1亿之间没有回文素数!!!
所以加上判断条件
if (b>9989899) {
b=9989899;
}
此时程序为
package 算法训练;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class 回文质数 {
static BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt(),b=scanner.nextInt();
if (b>9989899) {
b=9989899;
}
for (int i = a; i <=b; i++) {
if (hui(i)&&su(i)) {
out.write(i+"\n");
}
}
out.flush();
}
public static boolean hui(int p) {
char[] s=(p+"").toCharArray();
int l=s.length;
for (int i = 0; i < l/2; i++) {
if (s[i]!=s[l-i-1]) {
return false;
}
}
return true;
}
public static boolean su(int p) {
if (p<2) {
return false;
}
if (p%2==0) {
return false;
}
for (int i = 3; i*i <= p; i++) {
if (p%i==0) {
return false;
}
}
return true;
}
}
此时便可以成功AC
终于找到java题解了,试了线性筛超内存,埃氏筛法超内存,没想到最朴素的试除法竟然有奇效hh