[算法]淺談求n范圍以內的質數(素數)

汗顏,數學符號表達今天才學會呀-_-#

下面是百度百科對質數的定義

質數(prime number)又稱素數,有無限個。
質數定義為在大于1的自然數中,除了1和它本身以外不再有其他因數。
求質數的方法自然不少,但主要還是有三大方法,它們運用在不同的領域,根據數據也會變化;

1、傻子求質數法

這種方法十分無腦,任何一個人都能想出來,但這種方法竟然還有幾個優化ORZ

時間復雜度是O($N^{2}$);

1.1、無優化版本

 1 void prime()
 2 {
 3     int N = 10000;
 4     int primes[N],pos=0;
 5     register int i,j;
 6     for(i=2;i<N;i++){
 7         bool Flag=0;
 8         for(j=2;j<i;j++)
 9             if(i%j==0)Flag=1;
10         if(Flag==0)primes[++pos]=i; 
11     }
12 }

這也是所有求質數中最樸素的求法,自然在平常當中不會使用。

然而有些奇葩題目,求質數的次數很少,就可以用這個啦。↖(^ω^)↗

證明:質數定義為在大于1的自然數中,除了1和它本身以外不再有其他因數?——百度百科。

1.2、n/2 優化版本

 1 void prime()
 2 {
 3     int N = 10000;
 4     int primes[N],pos=0;
 5     register int i,j;
 6     for(i=2;i<N;i++){
 7         bool Flag=0;
 8         for(j=2;j<=i/2;j++)
 9             if(i%j==0)Flag=1;
10         if(Flag==0)primes[++pos]=i; 
11     }
12 }

?

這種優化就比上一種快一倍(時間復雜度),但仍然有缺陷,能不能再快一點??_?

證明:x/2以上的數增加就會重復。

1.3、n開平方優化版本

 1 void prime()
 2 {
 3     int N = 10000;
 4     int primes[N],pos=0;
 5     register int i,j;
 6     for(i=2;i<N;i++){
 7         bool Flag=0;
 8         for(j=2;j<=sqrt(n);j++)
 9             if(i%j==0)Flag=1;
10         if(Flag==0)primes[++pos]=i; 
11     }
12 }

?這個就是傻子求法的最終版本了,時間復雜度已經優化到了極限(個人認為)。囧rz

證明:因為x=$\sqrt{N}^{2}$的平方,所以sqrt(x)以上的數增加就會重復。

?


?2、埃氏(Eratosthenes)篩法

埃拉托斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉托斯特尼所提出的一種簡單檢定素數的算法。要得到自然數n以內的全部素數,必須把不大于根號n的所有素數的倍數剔除,剩下的就是素數。——百度百科

這種篩法大概是我初一學了快一個學期,開始學質因數時,自己過不了找質數一個題,然后接觸的一個算法。

埃氏的篩法思想精華,主要是把質數的倍數剔除,剩下的那些就是質數。+_+

這種算法的時間復雜度是O(nloglogn)。

 1 void prime()
 2 {
 3     int N=10000;
 4     register int i,j;
 5     bool prim[N];
 6     memset(prim,0,sizeof(prim));
 7     prim[1]=1;
 8     for(i=2;i<=sqrt(N);i++)
 9         if(prim[i]==0) 
10             for(j=i+i;j<=N;j+=i)
11             prim[j]=1;
12 }

3、歐拉(Euler)篩選法

歐拉篩法就是所謂中的高級篩法,時間復雜度削減到了O(N)。

它的思想是在埃氏篩法的基礎上,讓每個合數只被它的最小質因子篩選一次,以達到不重復的目的。

 1 void prime()
 2 {
 3     int N=10000;
 4     int prim[N],bz[N],top=0;
 5     memset(bz,0,sizeof(bz));
 6     register int i,j;
 7     for(i=2;i<=N;i++){
 8         if(!bz[i])prim[++top]=i;
 9          for(j=0;j<=top&&i*prim[j]<=N;j++){
10                  bz[i*prim[j]]=1;
11                  if(i%prim[j]==0)break;
12           }
13     }
14 }

自己還有很多東西都沒有學到,不知道什么時候才能脫掉蒟蒻的外套呢。

博主是初中蒟蒻,能力弱,還請大家多多提出改進建議:-D ? ?  ——2018.11.27

?

轉載于:https://www.cnblogs.com/lihepei/p/10026137.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537415.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進入IT行業,要不要參加培訓班?

IT行業介紹 考慮培訓班無非是要入行,那IT行業好不好?IT行業當然好,看看培訓班的數量就知道了。現在房產行業好賺錢,每個小區門口好幾家中介門店,相同品牌的可能不止1家。不用去看網上的軟文,也不用去問百度,看市場的反應,這是真實的反饋。培訓班越來越多,課程越來越多…

python commands_Windows環境下使用python的commands.getstatusoutput

windows調用系統或其他腳本的&#xff0c;常用的是os.popen&#xff0c;次命令本身并不返回執行后的狀態&#xff0c;無法用于后續的判斷&#xff0c;故嘗試Unix下的commands.getstatusoutput&#xff0c;發現在windows下并不能正常使用&#xff0c;如下&#xff1a; >>&…

Kubernetes在上汽集團云平臺及AI方面的應用

2019獨角獸企業重金招聘Python工程師標準>>> 帆一尚行成立于2015年&#xff0c;是上汽集團的全資子公司&#xff0c;建設有上海、南京、鄭州&#xff08;在建&#xff09;三個數據中心&#xff0c;擁有超過4000臺物理服務器&#xff0c;10PB的數據存儲&#xff0c;總…

我的Java培訓經歷

此文講述我的Java開發培訓經歷&#xff0c;來解答關心的培訓費、培訓節奏、就業等問題。 我在2010年參加達內Java培訓&#xff0c;如今再回首那段時光&#xff0c;雖然辛苦&#xff0c;但很值得&#xff01;&#xff08;后悔參加培訓班&#xff0c;大部分原因是沖動&#xff0…

python跨函數調用變量_對python中不同模塊(函數、類、變量)的調用詳解

首先&#xff0c;先介紹兩種引入模塊的方法。 法一&#xff1a;將整個文件引入 import 文件名 文件名.函數名( ) / 文件名.類名 通過這個方法可以運行另外一個文件里的函數 法二&#xff1a;只引入某個文件中一個類/函數/變量 需要從某個文件中引入多個函數或變量時&#xff0c…

軟件培訓技術選哪個?

要培訓了,培訓技術怎么選? 技術需慎重選 女怕嫁錯郎,男怕入錯行。后悔參加培訓班,因為技術沒選好的占比很高。 技術沒選好會有什么影響? 近的影響是就業!遠的影響是發展! 對于程序員來說,技術就是立身之本,需要慎重選擇! 我在《要不要參加培訓班?》文章中介紹…

django安裝_技術大牛詳解:Django框架之環境安裝

黑馬程序員視頻庫播妞微信號&#xff1a;boniu236傳智播客旗下互聯網資訊、學習資源免費分享平臺虛擬環境安裝:開發中問題&#xff1a;如何在同一臺主機中&#xff0c;要開發多個不同的項目&#xff0c;而且需要用到同一個包的不同版本&#xff1f;嘗試分析&#xff1a;在開發過…

安裝 Alibaba Cloud Toolkit

IntelliJ IDEA版 JetBrains 插件市場下載 Eclipse 版 Eclipse 插件市場倉庫下載 (推薦)URL 地址在線安裝Maven 版 在 POM 文件中依賴 PyCharm、PhpStorm、RubyMine 和 WebStorm 版 公測中官網https://toolkit.aliyun.com 交流群&#xff08;釘釘&#xff09; 交流群&#xff08…

軟件Java前端大數據培訓機構怎么選?

先看這篇文章《要不要參加培訓班》。 選技術就像選另一半,那選培訓機構就是選另一半的家庭。另一半家庭好與不好,與婚后幸福生活息息相關。 選培訓機構的幾個維度: 1.成立時間 2.專業性 3.市場普及率 成立時間 成立久的不一定好,比如北大某鳥 成立不足3年的,不要選…

高效管理論壇廣告貼的小竅門

歡迎訪問網易云社區&#xff0c;了解更多網易技術產品運營經驗。這里提供一個關于如何管理論壇廣告貼的深度視角。一般的論壇在發展初期&#xff0c;用戶自發產生的內容不多&#xff0c;每一條數據都彌足珍貴&#xff0c;因此幾乎不會考慮到反垃圾需求。隨著產品規模的擴大&…

Chrome瀏覽器多開,親測有效

原理 指定不同的用戶目錄&#xff0c;就可以實現多開。即&#xff1a;"--user-data-dir" 指定不同的目錄。 操作 新建用戶目錄文件夾 要開幾個&#xff0c;就新建幾個&#xff0c;文件夾名隨意。 復制chrome快捷方式 修改目標路徑 每個快捷方式&#xff0c;修改…

計算機技術與軟件專業技術資格(水平)考試 全國各省市成績查詢

大家好&#xff0c;我是51CTO學院的文慧&#xff0c;目前收到很多參加軟考考試的學生針對考試成績查詢的問題&#xff0c;無法一一幫助到大家&#xff0c;故開此博客&#xff0c;希望可以幫助到大家。 2018年下半年軟考合格標準是多少&#xff1f;根據近幾年軟考合格標準來看&a…

培訓時常犯的學習誤區與應對方法

和在學校里上課一樣,同一位老師教,同班同學成績不同。同學之間的資質都是差不多的,因學習方法不同,學習心態不同,課后努力程度不同導致的成績差異。 本文介紹下培訓時容易犯的學習誤區和誤區的應對方法。 誤區1 不懂不明白的地方,非要打破鐵鍋問到底。 應對方法 培訓…

julia有沒有希望超越python_未來5-10年,Julia會替代Python成為量化投資熱門語言嗎?...

今年上過一個quantative programming的課程&#xff0c;去年教學用的語言還是python&#xff0c;加速的方法用的是jit即時編譯來提高編程效率&#xff0c;今年課程的設計就改成Julia了。 因為自己從2016年起數據研究用的都是python&#xff0c;所以最開始使用Julia的時候并不習…

常見的三種撞庫方法

歡迎訪問網易云社區&#xff0c;了解更多網易技術產品運營經驗。 在安全領域向來是先知道如何攻&#xff0c;其次才是防。在介紹如何防范網站被黑客掃描撞庫之前&#xff0c;先簡單介紹一下什么是撞庫&#xff1a;撞庫是黑客通過收集互聯網已泄露的用戶和密碼信息&#xff0c;生…

超越培訓班同學的獨門絕技

???????本文講3個獨門絕技,十多年苦練多得,只傳有緣人。 ??????? 不訂閱,就是不給看 絕技1 -----權益保護線----- -----權益保護線----- -----權益保護線----- -----權益保護線----- -----權益保護線----- 寫CSDN博文 CSDN上有不少參加培訓班的…

python逐個讀取字符_玩轉python之字符串逐個字符或逐詞反轉

眾所周知&#xff0c;python中的字符串是無法改變的&#xff0c;反轉一個字符串自然要創建一個拷貝&#xff1b;最簡單的方法&#xff0c;當然是步長為“-1”的切片&#xff1a; result astring[::-1] 如果要是按單詞來反轉&#xff0c;需要三步完成&#xff1a;字符串--->…

WPF TextBox 正則驗證 大于等于0 小于等于1 的兩位小數

原文:WPF TextBox 正則驗證 大于等于0 小于等于1 的兩位小數正則&#xff1a;^(0\.\d|[1-9][0-9]|1)$ TextBox綁定正則驗證 <TextBox x:Name"txb" MaxLength"6" Margin"1 0 0 0" Width"40" > <TextBox.Text> …

DataQ數據對象為空的解決方法

問題 在dataq上面創建周期任務的時候發現了這么一個問題&#xff0c;配置好目標源之后&#xff0c;數據對象的下拉選項中是空的&#xff0c;如下圖。 原因 是因為目前無法使用自動創建目標表功能&#xff0c;需要自己去dataworks上面先自己創建好。 措施 1.創建目標表 2.創…

pythonifnotnone_使用 if x is not None 還是if not x is None

使用 if x is not None 還是if not x is None呢&#xff1f; 谷歌的風格指南和PEP-8都使用if x is not None&#xff0c;那么它們之間是否存在某種輕微的性能差異呢&#xff1f;通過測試發現沒有性能差異&#xff0c;因為它們編譯為相同的字節碼&#xff1a;Python 2.6.2 (r262…