[Java] Prime Palindromes

/* Use the slash-star style comments or the system won't see your
   identification information */
/*
ID: lincans1
LANG: JAVA
TASK: pprime
*/
import java.io.*;
import java.util.*;

public class pprime {

	private boolean isPrime(int num) {
		for (int i = 2, n = (int)Math.sqrt(num); i <= n; i++) {
			if (num % i == 0) {
				return false;
			}
		}
		return true;
	}

	private void count(int a, int b, PrintWriter out) {
		// 1 bits
	    for (int d1 = 1; d1 <= 9; d1 += 2) {
	    	int palindrome = d1;
	    	if (palindrome < a) {
	    		continue;
	    	}
	    	if (palindrome > b) {
	    		return;
	    	}
	    	if (isPrime(palindrome)) {
	    		out.println(palindrome);
	    	}
	    }
	    
	    // 2 bits
	    for (int d1 = 1; d1 <= 9; d1 += 2) {
	    	int palindrome = d1 * 10 + d1;
	    	if (palindrome < a) {
	    		continue;
	    	}
	    	if (palindrome > b) {
	    		return;
	    	}
	    	if (isPrime(palindrome)) {
	    		out.println(palindrome);
	    	}
	    }

	    // 3 bits
	    for (int d1 = 1; d1 <= 9; d1 += 2) {
			for (int d2 = 0; d2 <= 9; d2++) {
				int palindrome = 100 * d1 + 10 * d2 + d1;
				if (palindrome < a) {
					continue;
				}
				if (palindrome > b) {
					return;
				}
				if (isPrime(palindrome)) {
					out.println(palindrome);
				}
			}
	    }
	    
	    // 4 bits
		for (int d1 = 1; d1 <= 9; d1 += 2) {
			for (int d2 = 0; d2 <= 9; d2++) {
				int palindrome = 1000 * d1 + 100 * d2 + 10 * d2 + d1;
				if (palindrome < a) {
					continue;
				}
				if (palindrome > b) {
					return;
				}
				if (isPrime(palindrome)) {
					out.println(palindrome);
				}
			}
	    }
		
	    // 5 bits
		for (int d1 = 1; d1 <= 9; d1 += 2) {
			for (int d2 = 0; d2 <= 9; d2++) {
				for (int d3 = 0; d3 <= 9; d3++) {
					int palindrome = 10_000*d1 + 1000*d2 + 100*d3 + 10*d2 + d1;
					if (palindrome < a) {
						continue;
					}
					if (palindrome > b) {
						return;
					}
					if (isPrime(palindrome)) {
						out.println(palindrome);
					}
				}
			}
		}
		
		// 6 bits
		for (int d1 = 1; d1 <= 9; d1 += 2) {
			for (int d2 = 0; d2 <= 9; d2++) {
				for (int d3 = 0; d3 <= 9; d3++) {
					int palindrome = 100_000*d1 + 10_000*d2 + 1000*d3 + 100*d3 + 10*d2 + d1;
					if (palindrome < a) {
						continue;
					}
					if (palindrome > b) {
						return;
					}
					if (isPrime(palindrome)) {
						out.println(palindrome);
					}
				}
			}
		}

		// 7 bits
		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++) {
						int palindrome = 1000_000*d1 + 100_000*d2 + 10_000*d3 + 1000*d4 + 100*d3 + 10*d2 + d1;
						if (palindrome < a) {
							continue;
						}
						if (palindrome > b) {
							return;
						}
						if (isPrime(palindrome)) {
							out.println(palindrome);
						}
					}
					
				}
			}
		}

		// 8 bits
		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++) {
						int palindrome = 10_000_000*d1 + 1000_000*d2 + 100_000*d3 + 10_000*d4 + 1000*d4 + 100*d3 + 10*d2 + d1;
						if (palindrome < a) {
							continue;
						}
						if (palindrome > b) {
							return;
						}
						if (isPrime(palindrome)) {
							out.println(palindrome);
						}
					}
					
				}
			}
		}
	}

	public pprime() throws IOException {
		// Use BufferedReader rather than RandomAccessFile; it's much faster
		BufferedReader f = new BufferedReader(new FileReader("pprime.in"));
		PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("pprime.out")));

		// Use StringTokenizer vs. readLine/split -- lots faster
		StringTokenizer st = new StringTokenizer(f.readLine());

	    int a = Integer.parseInt(st.nextToken());
	    int b = Integer.parseInt(st.nextToken());
	    count(a, b, out);
	    out.close();
	    f.close();
	}
	
	public static void main (String [] args) throws IOException {
		new pprime();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值