隊列應用-素數環問題

問題描述: 將從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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章