素數的求解

素數的定義

定義:在一個大於0的自然數中,除了1和此整數自身外,不能被其他自然數整除的數。

思路<1> 試除法

思路<2> 試除法 + 拋去偶數

思路<3> 試除法 + 拋去偶數 + 縮小試除範圍

思路<4> 對素數試除法 + 減少掃描區間

————————————
思路(3) 試除法 + 拋去偶數 + 縮小試除範圍

具體思路:思路 1和思路 2的試除範圍都在[2,n - 1],其實範圍可以限制在[2,sqrt[n]],因爲如果一個數不是素數,那麼它肯定有至少有倆因子,而且因子也是成對出現的,而且一個因子是大於sqrt[n]的,一個因子是小於sqrt[n]的。

代碼:

///試除法 + 刨除偶數 + 減少掃描區間  
bool IsPrime(int nNum)  
{  
    if (nNum == 2)  
    {  
        return true;  
    }  
    if ((nNum & 1) == 0)//刨除偶數  
    {  
        return false;  
    }  
    for (int i = 3;i * i <= nNum;i += 2)  
    {  
        if (nNum % i == 0)  
        {  
            return false;  
        }  
    }  
    return true;  
}  

在單獨處理偶數時,這裏使用位操作進行做的,效率比取餘操作高。

————————————–
思路(4) 對素數試除法 + 減少掃描區間
分析:
(1)合數(不是素數就是合數)是由若干個質數相乘而得來的,比如,合數6是有素數2和3相乘得到。15是由素數3和5相乘得到。
(2)前幾個思路使用試除法時,也對合數進行了取餘,所以造成浪費。比如判斷103是否爲素數時,如果採用試除法 + 拋去偶數 + 縮小試除範圍的方法,則需要取餘的整數爲2,3,5,7,9,10。我們可以觀察3和9,如果一個數N能被9整除,那麼它肯定能被3整除。反過來說,如果N不能被3整除,則肯定不能被9整除。因此我們只需要檢查3即可。對於10也是,如果N不能被2和5整除,它肯定也不能被10整除。

因此,我們要判斷數N是否是素數時,只需要對[1,sqrt(N)]之間的素數進行試除即可。

注意,這裏的前提是我們已知[1,sqrt(N)]之間的素數。

代碼:假設我們已經知道素數集合nArrPrimeTable中,素數個數爲nCount個。

//對素數試除法 + 減少掃描區間  
bool IsPrime(int nNum)  
{  
    if (nNum == 2)  
    {  
        return true;  
    }  
    for (int i = 0;i < nCount && nArrPrimeTable[i] * nArrPrimeTable[i] <= nNum;i++)  
    {  
        if (nNum % nArrPrimeTable[i] == 0)  
        {  
            return false;  
        }  
    }  
    return true;  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章