問題描述: 將從1到n這n個整數圍成一個圓環,若其中任意2個相鄰的數字相加,結果均爲素數,那麼這個環就成爲素數環。
求解思路:
先將1放入素數環,設置一個隊列,將2-n的自然數全部入隊,每次對出對的一個元素k進行測試,若符合要求,則將k加入到素數環中,否則將k再次入隊等待,重複次不步驟直至隊列爲空。
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
/**
* 素數環問題
*
*/
public class PrimeRing {
//求1-n素數環
public PrimeRing(int n){
List<Integer> ring=new ArrayList<Integer>();//用於存儲素數環
ring.add(1); //將1添加到素數環中
Deque<Integer> que=new ArrayDeque<Integer>(n); //創建一個隊列,FIFO
//2-n全部入隊
for(int i=2;i<=n;i++){
que.addLast(i); //依次入隊
}
int i=0;
while(!que.isEmpty()){
int k=que.removeFirst(); //隊首元素出隊
if(isPrime(ring.get(i)+k)){
i++;
ring.add(k);
}else{
que.addLast(k);
}
}
System.out.println("素數環:"+ring.toString());
}
//判斷一個數是否爲素數
public boolean isPrime(int n){
if(n==2)
return true;
if(n<2 || n>2 && n%2==0)
return false;
int j=(int)Math.sqrt(n); //返回n的平方根
if(j%2==0)
j--;
while(j>2 && n%j!=0)
j-=2;
return j<2;
}
public static void main(String[] args) {
PrimeRing pr=new PrimeRing(10);
}
}