可逆素数
- 2019 年 11 月 3 日
- 筆記
可逆素数
问题描述
编写程序找出1-900之间所有的可逆素数(可逆素数是指一个素数的各位数值顺序颠倒后得到的数仍未素数,如113,311)
算法思路
- 用筛法找到900以内素数表prime[]
- 迭代prime[]所有的数,检测其相反数是否也为素数
代码示例
Python
# 找出100-900的可逆素数 # 1. 构建素数表prime[],存放1-900的素数 # 2. 遍历prime[],找出可逆素数 pt = [True] * 1000 # 筛表 def isPrime(n): if pt[n] : for x in range(n,1000,n): pt[x]=False return True else: return False # 1. 构建素数表 prime = [] # 素数表 for x in range(2,901): if isPrime(x): prime.append(x) # 2. 遍历prime,找出可逆素数 for x in prime: xx = str(x) xx = int(xx[::-1]) # 字符串倒置 if isPrime(xx): print(x)
Java
import java.util.ArrayList; import java.util.List; public class 可逆素数 { //1. 构建素数表prime[],存储1-900的素数 //2. 遍历prime,找出可逆素数 static boolean[] pt; // 筛表 static void init(){ pt = new boolean[1000]; for(int i=0;i<pt.length;i++){ pt[i]=true; } } static boolean isPrime(int n){ if(pt[n]){ // 更新筛表 for(int i=n;i<pt.length;i+=n){ pt[i]=false; } return true; }else{ return false; } } public static void main(String[] args) { init(); List<Integer> prime = new ArrayList<>(); for(int i=2;i<901;i++){ if(isPrime(i)){ prime.add(i); } } for (Integer x : prime) { StringBuilder sb = new StringBuilder(x+""); sb = sb.reverse(); int y = new Integer(sb.toString()); if(isPrime(y)){ System.out.println(x); } } } }