判斷素數(shù)-埃氏篩法的詳解

埃氏篩法

一個判斷素數(shù)的高效算法

關(guān)于埃氏篩法的百度百科解釋在這里埃拉托斯特尼篩法,當(dāng)然我不可能給個百度百科的解釋就撤瘦锹,那會被打死的籍嘹。
眾所周知,素數(shù)指的是除了1和它本身之外沒有其它約數(shù)的數(shù)
我們假定一個數(shù)num沼本,那么如果我們想通過編程來判斷它是不是素數(shù)噩峦,我們首先通過它的定義想到暴力枚舉方法,即用for循環(huán)配合取模操作實現(xiàn)抽兆,c++代碼如下

bool flag = true; // flag作為標(biāo)志來標(biāo)識這個數(shù)是不是素數(shù),默認(rèn)設(shè)置為true
for(int i=2;i<num/2;i++)
{
    if(num % i == 0)
    {
        flag = false; // 如果能被整除了族淮,那就不是素數(shù)辫红,退出循環(huán)
        break;
    }
}
if(flag)
{
    cout<<"數(shù):"<<num<<"是素數(shù)"<<endl;
}

當(dāng)然這種方法就顯得很麻煩凭涂,雖然直觀易懂,但是時間復(fù)雜度達(dá)到了n^2級贴妻。
當(dāng)然如果稍微改進(jìn)一點的話就會知道把我上面的代碼循環(huán)中的i < num/2改成i*i < num切油,時間可以縮短。但是仍不夠明顯名惩。


快樂的分割線


下面我們開始埃氏篩法的學(xué)習(xí)

看過上圖百度百科的同學(xué)應(yīng)該明白澎胡,埃氏篩法是范圍判斷素數(shù)的方法,即娩鹉,你給出一個數(shù)n攻谁,我用埃氏篩法能判斷從1-n的所有素數(shù)出來。

原理

素數(shù)的倍數(shù)肯定不是素數(shù)

給定一個數(shù)n弯予,我們開一個大小為n+1的bool型數(shù)組戚宦,即 bool nums[n+1] ,并全部初始化為false锈嫩, 在這里聲明一點受楼,這個數(shù)組的 nums[0] 與 nums[1] 我們并不會使用到。
建立了這樣一個數(shù)組之后呼寸,我們就可以直接開干啦艳汽,我們首先要找到最小的素數(shù),即2对雪,從而開始循環(huán)開炮
OK非常棒河狐,現(xiàn)在我們已經(jīng)能找出素數(shù)中的最小者了,任務(wù)完成一半慌植!
接下來甚牲,我們應(yīng)用我們的原理——素數(shù)的倍數(shù)肯定不是素數(shù)
這里有張表

是否是素數(shù)
2
3
4 不是(通過素數(shù)2的倍數(shù)判斷)
5
6 不是(通過素數(shù)2,3的倍數(shù)判斷)
7
8 不是(通過素數(shù)2的倍數(shù)判斷)
9 不是(通過素數(shù)3的倍數(shù)判斷)
加入我們要求10以內(nèi)的素數(shù),開一個nums[11]蝶柿,然后定位找到最小的素數(shù)->2丈钙,以2為基點,開炮交汤,把2的倍數(shù)全部打死雏赦,當(dāng)然這個也是有范圍的,2的倍數(shù)我們只要判斷到小于n就可以了芙扎,即小于10星岗。然后2的倍數(shù)打死完了,再找幸存的最小素數(shù)3戒洼,以3為基點俏橘,開炮,在3的炮火攻擊下圈浇,上次僥幸存活的9被揪出來打死了寥掐。***我們會一直判斷靴寂,直到我們的基點達(dá)到一個臨界點——小于等于n的開根號,這樣我們就把所有潛藏的合數(shù)敵人全部消滅了召耘,不信你瞅瞅百炬? ***

原理如此,接下來附上這一部分的代碼污它,看完代碼之后我會有一個小小的問題遺留給大家思考

int main() // 這里只給出實現(xiàn)代碼了剖踊,上面的頭文件什么的都沒寫了
{
    int num;
    cin >> num;
    bool* nums = new bool[num];   // 這里我們?nèi)绻枰米兞縿?chuàng)建數(shù)組的話必須這樣創(chuàng)建喔!
    for (int i = 0; i < num; i++)
    {
        nums[i] = true;
    }
    int sn = sqrt(num);
    for (int i = 2; i <= sn; i++) /* 從最小的素數(shù)2開始開炮*/
    {
        if (nums[i])
        {
            for (int j = i * i; j < num; j+=i)  // 此處需要注意衫贬,我們開炮的時候德澈,第一顆炮彈直接打到i的平方上,這是避免了重復(fù)判斷祥山,j每次要增長i
            {
                nums[j] = false;   // 跟我一起圃验,開炮!缝呕!
            }
        }
    }
    for (int i = 2; i < num; i++)
    {
        if (nums[i])
        {
            cout << i << "\t";  // 打印出選出來的素數(shù)你看看澳窑,這里我喜歡用制表符,個人習(xí)慣供常,看著舒服
        }
    }

    delete []nums;  // 最后可別忘了釋放指針內(nèi)存哦摊聋,并且將指針置空,養(yǎng)成好習(xí)慣栈暇,不要野指針麻裁!
    nums = nullptr;
    return 0;
}

好了,代碼部分結(jié)束源祈,最后我還遺留一個問題煎源,你們有沒有發(fā)現(xiàn),我們這里重復(fù)判斷了香缺?比如我已經(jīng)判斷12是偶數(shù)了手销,已經(jīng)殺死了,但是我以3為基點開炮的時候图张,還是會再打它一次锋拖,炸尸,這會不會浪費我們的炮彈資源(時間)呢祸轮?該如何改進(jìn)這個問題呢兽埃?思考一下?

謝謝你來看我适袜!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柄错,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鄙陡,老刑警劉巖冕房,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躏啰,死亡現(xiàn)場離奇詭異趁矾,居然都是意外死亡,警方通過查閱死者的電腦和手機给僵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門毫捣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帝际,你說我怎么就攤上這事蔓同。” “怎么了蹲诀?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵斑粱,是天一觀的道長。 經(jīng)常有香客問我脯爪,道長则北,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任痕慢,我火速辦了婚禮尚揣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掖举。我一直安慰自己快骗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布塔次。 她就那樣靜靜地躺著方篮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪励负。 梳的紋絲不亂的頭發(fā)上藕溅,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音熄守,去河邊找鬼蜈垮。 笑死,一個胖子當(dāng)著我的面吹牛裕照,可吹牛的內(nèi)容都是我干的攒发。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼晋南,長吁一口氣:“原來是場噩夢啊……” “哼惠猿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起负间,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤偶妖,失蹤者是張志新(化名)和其女友劉穎姜凄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趾访,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡态秧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扼鞋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片申鱼。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖云头,靈堂內(nèi)的尸體忽然破棺而出捐友,到底是詐尸還是另有隱情,我是刑警寧澤溃槐,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布匣砖,位于F島的核電站,受9級特大地震影響昏滴,放射性物質(zhì)發(fā)生泄漏猴鲫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一影涉、第九天 我趴在偏房一處隱蔽的房頂上張望变隔。 院中可真熱鬧,春花似錦蟹倾、人聲如沸匣缘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肌厨。三九已至,卻和暖如春豁陆,著一層夾襖步出監(jiān)牢的瞬間柑爸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工盒音, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留表鳍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓祥诽,卻偏偏與公主長得像譬圣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雄坪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349