[洛谷每日一题]P1217 [USACO1.5]回文质数 Prime Palindromes

该文章介绍了一种利用Java编程解决寻找指定范围内回文质数的方法。通过生成回文数数组并结合质数判断算法,筛选出在特定区间内的回文质数。代码包括回文数生成和质数判断两个主要部分。
摘要由CSDN通过智能技术生成

昨天也刷了一道关于质数的题,今天来补个刀,题目是这样的:

 因为质数没有回文数多,我就采用了先生成回文数判断质数的方法;

生成回文数:

为了避免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]);
			}
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值