137 字 少于 1 分钟阅读

题目

求一亿以内的回文质数。

思路

先求质数再判断回文,效率低下。所以先构造回文数,再判断质数。

再观察回文数中哪些可以提前排除。

比如:

  • 大于 2 的偶数一定是合数,所以只构建奇数回文数即可。
  • 偶数位长度的回文数都能被 11 整除,比如 1331。所以偶数位的回文数除了 11 都是合数。
  • 一个 \(k\) 位数,可以构造出一个 \(2 * k + 1\)位的回文数。比如 13,可以构造 131;189 可以构造 18981。所以 100000000 内的只要从 1 构造到 9999 即可。
public class Solution {

    public List<Integer> PalindromePrimeNum(String[] args) {
        List<Integer> res = new ArrayList<>();
        res.add(11);
        StringBuilder builder;
        for (int i = 12; i <= 9999; i++) {
            builder = new StringBuilder(String.valueOf(i));
            if ((builder.charAt(0) - '0') % 2 == 0) {
                // 首位是偶数,回文后也会是偶数
                continue;
            }
            // 拼接回文数
            int len = builder.length();
            StringBuilder right = new StringBuilder(builder.substring(0, len - 1));
            builder.append(right.reverse());
            int palindromeNum = Integer.parseInt(builder.toString());
            if (checkPrimeNumber(palindromeNum)) {
                res.add(palindromeNum);
            }
        }
        return res;
    }

    public boolean checkPrimeNumber(int num) {
        // 判断是不是质数
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}