求一億以內的迴文素(質)數
先求質數再判斷迴文,效率低下;所以先構造迴文數,再判斷質數。
偶數位的迴文數都能被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 ;
}
}