码迷,mamicode.com
首页 > 其他好文 > 详细

ARTS打卡计划第四周-ALGORITHM

时间:2019-05-11 10:52:16      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:menuitem   algorithm   .so   return   lis   font   void   imp   bool   

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);
	}

}

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

ARTS打卡计划第四周-ALGORITHM

标签:menuitem   algorithm   .so   return   lis   font   void   imp   bool   

原文地址:https://www.cnblogs.com/dongqiSilent/p/10847886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!