ARTS打卡计划第四周-ALGORITHM

866. 回文素数

求出大于或等于 N 的最小回文素数。

回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数

例如,2,3,5,7,11 以及 13 是素数。

回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。

例如,12321 是回文数。

package com711;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Solution866 {
	public int primePalindrome(int N) {
		List<Integer> list = getPalindrome(N);
		Collections.sort(list);
		return list.get(0);

	}

	public List<Integer> getPalindrome(int N) {
		List<Integer> list = new ArrayList<Integer>();
		// 10以内的特例
		for (int i = N; i < 10; i++) {
			if (isPrime(i)) {
				list.add(i);
				return list;
			}

		}
		int start = getMinStart(N);
		// 双数的判断
		for (int i = (int) Math.pow(10, start); i < 10000; i++) {
			int num = Integer.parseInt(i + "" + reverse(i));
			if (num >= N && isPrime(num) && num < 200000000) {
				list.add(num);
				break;
			}
		}

		for (int i = (int) Math.pow(10, start); i < 10000; i++) {
			for (int j = 0; j <= 9; j++) {
				int num1 = Integer.parseInt(i + "" + j + reverse(i));
				if (num1 >= N && isPrime(num1) && num1 < 200000000) {					
					list.add(num1);
					return list;
				}
			}

		}

		return list;
	}

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

	public String reverse(int n) {
		char[] chars = (n + "").toCharArray();
		int len = chars.length;
		for (int i = 0; i < len / 2; i++) {
			char temp = chars[i];
			chars[i] = chars[len - i - 1];
			chars[len - i - 1] = temp;
		}
		return new String(chars);
	}

	public boolean isHuiWen(int n) {
		char[] chars = (n + "").toCharArray();
		int len = chars.length;
		for (int i = 0; i < len; i++) {
			if (chars[i] != chars[len - i - 1]) {
				return false;
			}
		}
		return true;

	}

	public int getMinStart(int n) {
		String str = n + "";
		str = str.substring(0, str.length() / 2);

		return str.length() / 2;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution866 s = new Solution866();

		long start = System.currentTimeMillis();
		System.out.println(s.primePalindrome(85709140));
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}

}

  本题最大的困扰是如果直接不找规律遍历的话,你肯定会超时。因此要用最快的方法,找到最近的回文数,去判断。

猜你喜欢

转载自www.cnblogs.com/dongqiSilent/p/10847886.html