質(zhì)數(shù)判斷與埃氏篩

質(zhì)數(shù)判斷

我們來看這么一道問題:

給定一個范圍N,你需要處理M個某數(shù)字是否為質(zhì)數(shù)的詢問(每個數(shù)字均在范圍1-N內(nèi))N<=10000000叔壤,M<=100000

首先很容易聯(lián)想到使用枚舉法來確定題目的整體框架

for( i: 1~m)
{
    cin>>x;
    if(x是質(zhì)數(shù))
    {
        yes;
    }else
    {
        no;
    }
}

關鍵在于質(zhì)數(shù)判斷部分竹海。

質(zhì)數(shù)的判斷問題我們可以從定義出發(fā)昭伸。質(zhì)數(shù)缀拭,又稱素數(shù)织阳,是除了1和它自身以外沒有其他的因子眶蕉。

bool isPrime(int x)
{
    if(x==1) return false;
    for(int i=2;i<x;i++)
    {
        if(x%i==0) return false;
    }
    return true;
}

稍微計算下整體的時間復雜度砰粹,可以發(fā)現(xiàn)用時會比較多唧躲,那么我們可以思考下優(yōu)化的地方。整體框架確定后碱璃,能優(yōu)化的地方可從質(zhì)數(shù)判斷入手弄痹。思考,一個數(shù)去除以比它的一半還要大的數(shù)嵌器,一定是除不盡的肛真,因此,除到x/2就夠了爽航。

再改進一下蚓让,一個數(shù)若可以進行因數(shù)分解,那么分解得到的兩個數(shù)一個范圍小于sqrt(x),另一個一定大于sqrt(x)讥珍。故历极,上述代碼我們也只需要遍歷到sqrt(x)就可以了。若在2~sqrt(x)找不到約數(shù)衷佃,那么一定不存在趟卸。

bool isPrime(int x)
{
    if(x==1) return false;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0) return false;
    }
    return true;
}

再進一步進行優(yōu)化,偶數(shù)一定不是質(zhì)數(shù)

bool isPrime(int x)
{
    if(x<2) return false;
    if(n%2==0) return false;
    
    for(int i=3;i*i<=x;i+=2)
    {
        if(x%i==0) return false;
    }
    return true;
}

但當m,n很大的時侯這種方式的數(shù)量級依舊相當大。在一般的機子它不是一秒鐘跑不出結果锄列,它是好幾分鐘都跑不出結果图云。有沒有更有效率的方法呢?

我們可以考慮使用篩法來進行處理邻邮。

埃氏篩

根據(jù)數(shù)學原理:一個合數(shù)總是可以分解成若干個質(zhì)數(shù)的乘積竣况,換個角度去理解,也就是說合數(shù)是某個質(zhì)數(shù)的倍數(shù)筒严。此時如果把質(zhì)數(shù)的倍數(shù)都去掉帕翻,那么剩下的就是質(zhì)數(shù)了。

這樣的篩選方式叫做埃氏篩萝风,也叫埃拉托色尼選篩法嘀掸,是數(shù)學家埃拉托色尼提出的。

代碼思路:

  1. 從質(zhì)數(shù)2開始進行枚舉
  2. 如果數(shù)字是質(zhì)數(shù)规惰,將范圍內(nèi)所有該數(shù)的倍數(shù)標記成非質(zhì)數(shù)
  3. 繼續(xù)向后枚舉睬塌,直到遍歷完范圍內(nèi)所有的數(shù)位置

代碼實現(xiàn):

#include <iostream>
#include <cstring>
using namespace std;

bool isPrime[10000005]={0};//標記數(shù)組 用來表示數(shù)字是否是質(zhì)數(shù) true-是質(zhì)數(shù) false-不是質(zhì)數(shù)

void aiPrime(int n)
{// 埃氏篩處理n內(nèi)的質(zhì)數(shù)
    memset(isPrime,true,sizeof(isPrime));//所有數(shù)字,默認標記為質(zhì)數(shù) 
    isPrime[1]=false;//修改1的狀態(tài)歇万,1不是質(zhì)數(shù)
    
    for(int i=2;i<=n;i++)//從2開始揩晴,枚舉范圍n內(nèi)的每個數(shù)字 
    {
        if(isPrime[i])//如果i是質(zhì)數(shù)
        {//將n范圍內(nèi)所有i的倍數(shù),標記為非質(zhì)數(shù) 
            for(int j=2;j*i<=n;j++)
            {//打底從兩倍開始,j*i就是i的倍數(shù) 
                isPrime[i*j]=false;// 標記倍數(shù)為非質(zhì)數(shù) 
            }
            
        }
    }
}

int main(int argc, char** argv) {
    int n,m,x;
    cin>>n>>m;
    aiPrime(n);
    for(int i=1;i<=m;i++)
    {
        cin>>x;
        if(isPrime[x])
        {
            cout<<"yes\n";
        }else
        {
            cout<<"no\n";
        }
    }
     
    return 0;
} 
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贪磺,一起剝皮案震驚了整個濱河市硫兰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寒锚,老刑警劉巖劫映,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刹前,居然都是意外死亡泳赋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門喇喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祖今,“玉大人,你說我怎么就攤上這事拣技∏埽” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵膏斤,是天一觀的道長徐绑。 經(jīng)常有香客問我,道長掸绞,這世上最難降的妖魔是什么泵三? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任耕捞,我火速辦了婚禮,結果婚禮上烫幕,老公的妹妹穿的比我還像新娘俺抽。我一直安慰自己,他們只是感情好较曼,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布磷斧。 她就那樣靜靜地躺著,像睡著了一般捷犹。 火紅的嫁衣襯著肌膚如雪弛饭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天萍歉,我揣著相機與錄音侣颂,去河邊找鬼。 笑死枪孩,一個胖子當著我的面吹牛憔晒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔑舞,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼拒担,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了攻询?” 一聲冷哼從身側響起从撼,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钧栖,沒想到半個月后低零,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡桐经,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年毁兆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阴挣。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纺腊,靈堂內(nèi)的尸體忽然破棺而出畔咧,到底是詐尸還是另有隱情,我是刑警寧澤揖膜,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布誓沸,位于F島的核電站,受9級特大地震影響壹粟,放射性物質(zhì)發(fā)生泄漏拜隧。R本人自食惡果不足惜宿百,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洪添。 院中可真熱鬧垦页,春花似錦、人聲如沸干奢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忿峻。三九已至薄啥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逛尚,已是汗流浹背垄惧。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绰寞,地道東北人赘艳。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像克握,于是被迫代替她去往敵國和親蕾管。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容