求一亿以内的回文质数(素数)

求一亿以内的回文素(质)数

先求质数再判断回文,效率低下;所以先构造回文数,再判断质数。
偶数位的回文数都能被11整除。所以,偶数位的回文数除了11都是合数。

观察偶数位的回文数,提取所有奇数位的数字,与提取所有偶数位的数字,正好是相反的顺序。
因此,偶数位数和等于奇数位数和,从而差等于0,而0能被11整除,因此这个回文数,可以被11整除
例:1331 13 31
或者
an…a2a1a1a2…an.然后可将其改写(首尾两两依次配对):an...a2a1a1a2...an=an*(10^(2n-1)+1)+...+a2*(10^(2*2-1)+1)*10^(n-2)+a1*(10^(2*1-1)+1)*10^(n-1)可以看到求和的每一项均有因式10^(2k-1)+1
而该因式又含有因式10+1=11,故和是11的倍数。

一个k位数,可以构造出一个奇数位的回文数。比如13,可以构造131;189可以构造18981.所以100000000内的只要从1构造到9999即可。

import java.util.ArrayList;

public class 一亿以内的回文质数 {
	public static ArrayList<Integer> list = new ArrayList<Integer>(); 
	public static void main(String[] args) {
		list.add(11);
		for (int i = 2; i < 100; i++) {
			int tmp = i / 10, sum;

			for (sum = i; tmp != 0; tmp /= 10) {
				sum = sum * 10 + tmp % 10;
			}

			bool(sum);
		}
		System.out.println(list);
	}
	public static void bool(int n){
		int sqrt =   (int) Math.sqrt(n+0.5);
		for(int i:list){
			if(n%i==0){
				return  ;
			}
			else if(i>sqrt){
				return  ;
			}
		}
		list.add(n);
		return  ;
	}

}

原文地址:https://www.cnblogs.com/a1439775520/p/13075984.html