日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

判断一个数是否为两个素数乘积_如何高效筛选素数?

發(fā)布時間:2023/12/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 判断一个数是否为两个素数乘积_如何高效筛选素数? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

讀完本文,你可以去力扣拿下如下題目:

204.計數(shù)質(zhì)數(shù)

-----------

素數(shù)的定義看起來很簡單,如果一個數(shù)如果只能被 1 和它本身整除,那么這個數(shù)就是素數(shù)。

不要覺得素數(shù)的定義簡單,恐怕沒多少人真的能把素數(shù)相關(guān)的算法寫得高效。比如讓你寫這樣一個函數(shù):

// 返回區(qū)間 [2, n) 中有幾個素數(shù) int countPrimes(int n)// 比如 countPrimes(10) 返回 4 // 因為 2,3,5,7 是素數(shù)

你會如何寫這個函數(shù)?我想大家應(yīng)該會這樣寫:

int countPrimes(int n) {int count = 0;for (int i = 2; i < n; i++)if (isPrim(i)) count++;return count; }// 判斷整數(shù) n 是否是素數(shù) boolean isPrime(int n) {for (int i = 2; i < n; i++)if (n % i == 0)// 有其他整除因子return false;return true; }

這樣寫的話時間復(fù)雜度 O(n^2),問題很大。首先你用 isPrime 函數(shù)來輔助的思路就不夠高效;而且就算你要用 isPrime 函數(shù),這樣寫算法也是存在計算冗余的。

先來簡單說下如果你要判斷一個數(shù)是不是素數(shù),應(yīng)該如何寫算法。只需稍微修改一下上面的 isPrim 代碼中的 for 循環(huán)條件:

boolean isPrime(int n) {for (int i = 2; i * i <= n; i++)... }

換句話說,i 不需要遍歷到 n,而只需要到 sqrt(n) 即可。為什么呢,我們舉個例子,假設(shè) n = 12。

12 = 2 × 6 12 = 3 × 4 12 = sqrt(12) × sqrt(12) 12 = 4 × 3 12 = 6 × 2

可以看到,后兩個乘積就是前面兩個反過來,反轉(zhuǎn)臨界點就在 sqrt(n)。

換句話說,如果在 [2,sqrt(n)] 這個區(qū)間之內(nèi)沒有發(fā)現(xiàn)可整除因子,就可以直接斷定 n 是素數(shù)了,因為在區(qū)間 [sqrt(n),n] 也一定不會發(fā)現(xiàn)可整除因子。

現(xiàn)在,isPrime 函數(shù)的時間復(fù)雜度降為 O(sqrt(N)),但是我們實現(xiàn) countPrimes 函數(shù)其實并不需要這個函數(shù),以上只是希望讀者明白 sqrt(n) 的含義,因為等會還會用到。

PS:我認(rèn)真寫了 100 多篇原創(chuàng),手把手刷 200 道力扣題目,全部發(fā)布在 labuladong的算法小抄,持續(xù)更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了。

高效實現(xiàn) `countPrimes`

高效解決這個問題的核心思路是和上面的常規(guī)思路反著來:

首先從 2 開始,我們知道 2 是一個素數(shù),那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8… 都不可能是素數(shù)了。

然后我們發(fā)現(xiàn) 3 也是素數(shù),那么 3 × 2 = 6, 3 × 3 = 9, 3 × 4 = 12… 也都不可能是素數(shù)了。

看到這里,你是否有點明白這個排除法的邏輯了呢?先看我們的第一版代碼:

int countPrimes(int n) {boolean[] isPrim = new boolean[n];// 將數(shù)組都初始化為 trueArrays.fill(isPrim, true);for (int i = 2; i < n; i++) if (isPrim[i]) // i 的倍數(shù)不可能是素數(shù)了for (int j = 2 * i; j < n; j += i) isPrim[j] = false;int count = 0;for (int i = 2; i < n; i++)if (isPrim[i]) count++;return count; }

如果上面這段代碼你能夠理解,那么你已經(jīng)掌握了整體思路,但是還有兩個細(xì)微的地方可以優(yōu)化。

首先,回想剛才判斷一個數(shù)是否是素數(shù)的 isPrime 函數(shù),由于因子的對稱性,其中的 for 循環(huán)只需要遍歷 [2,sqrt(n)] 就夠了。這里也是類似的,我們外層的 for 循環(huán)也只需要遍歷到 sqrt(n):

for (int i = 2; i * i < n; i++) if (isPrim[i]) ...

除此之外,很難注意到內(nèi)層的 for 循環(huán)也可以優(yōu)化。我們之前的做法是:

for (int j = 2 * i; j < n; j += i) isPrim[j] = false;

這樣可以把 i 的整數(shù)倍都標(biāo)記為 false,但是仍然存在計算冗余。

比如 n = 25,i = 4 時算法會標(biāo)記 4 × 2 = 8,4 × 3 = 12 等等數(shù)字,但是這兩個數(shù)字已經(jīng)被 i = 2 和 i = 3 的 2 × 4 和 3 × 4 標(biāo)記了。

我們可以稍微優(yōu)化一下,讓 j 從 i 的平方開始遍歷,而不是從 2 * i 開始:

for (int j = i * i; j < n; j += i) isPrim[j] = false;

PS:我認(rèn)真寫了 100 多篇原創(chuàng),手把手刷 200 道力扣題目,全部發(fā)布在 labuladong的算法小抄,持續(xù)更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了。

這樣,素數(shù)計數(shù)的算法就高效實現(xiàn)了,其實這個算法有一個名字,叫做 Sieve of Eratosthenes??聪峦暾淖罱K代碼:

int countPrimes(int n) {boolean[] isPrim = new boolean[n];Arrays.fill(isPrim, true);for (int i = 2; i * i < n; i++) if (isPrim[i]) for (int j = i * i; j < n; j += i) isPrim[j] = false;int count = 0;for (int i = 2; i < n; i++)if (isPrim[i]) count++;return count; }

該算法的時間復(fù)雜度比較難算,顯然時間跟這兩個嵌套的 for 循環(huán)有關(guān),其操作數(shù)應(yīng)該是:

n/2 + n/3 + n/5 + n/7 + …
= n × (1/2 + 1/3 + 1/5 + 1/7…)

括號中是素數(shù)的倒數(shù)。其最終結(jié)果是 O(N * loglogN),有興趣的讀者可以查一下該算法的時間復(fù)雜度證明。

以上就是素數(shù)算法相關(guān)的全部內(nèi)容。怎么樣,是不是看似簡單的問題卻有不少細(xì)節(jié)可以打磨呀?

_____________

我的 在線電子書 有 100 篇原創(chuàng)文章,手把手帶刷 200 道力扣題目,建議收藏!對應(yīng)的 GitHub 算法倉庫 已經(jīng)獲得了 70k star,歡迎標(biāo)星!

總結(jié)

以上是生活随笔為你收集整理的判断一个数是否为两个素数乘积_如何高效筛选素数?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚州成人| 精品成人一区二区 | 国产色啪| 1024国产在线| 久操香蕉 | 国产精品一区二 | 一区二区免费在线观看视频 | 麻豆疯狂做受xxxx高潮视频 | 精品xxx | 伊人久久大香线蕉成人综合网 | 都市激情亚洲 | 男生操女生免费网站 | 97精品国产97久久久久久粉红 | 男人天堂a | 亚洲天堂2018av | 欧洲免费av | 久久艹这里只有精品 | 色多多视频在线观看 | 色先锋在线| 黄色三级三级三级三级 | 欧美成人小视频 | 深夜免费福利视频 | 国产亚洲一区二区三区在线观看 | www视频在线观看 | 91久久精品一区二区三区 | 亚洲中文字幕无码av | 激情另类小说 | 男女啊啊啊视频 | 国产成人日韩 | 人物动物互动39集免费观看 | 撸啊撸在线视频 | 男人日女人b视频 | 色播在线播放 | 国产精品高潮呻吟视频 | 性视频网 | 一本色道久久综合亚洲精品图片 | 成人在线观看国产 | 欧美成人国产 | 免费一区二区视频 | 爆操91| 免费网站看av | 成人免费精品视频 | 亚洲草逼 | 黄网地址| 亚洲少妇一区 | 婷婷久久五月天 | 国产精品伦一区 | 五月激情开心网 | 在线观看免费av网址 | 欧美一级一区二区三区 | 天天射天天拍 | 中文字幕观看av | 天堂网8 | 人妻熟女aⅴ一区二区三区汇编 | 精品99999| 日产久久久久久 | 日韩图色 | 国产伦精品一区二区三区免费迷 | 丝袜操 | 欧美人妻一区二区三区 | 综合精品视频 | 日韩欧美在线播放 | 国产免费叼嘿网站免费 | 国产一区在线观看视频 | 91视频免费网站 | 亚洲人成人| 五月婷婷中文字幕 | 男女羞羞动态图 | 一级黄色片片 | 亚洲三级国产 | 91大片免费看 | 91精品专区 | 理想之城连续剧40集免费播放 | 在线观看免费毛片 | 欧美视频你懂的 | 欧美精品四区 | 国产精品视频在 | 老女人一毛片 | 亚洲午夜精品久久久久久人妖 | 亚洲青草| 欧美国产在线一区 | 精精国产xxxx视频在线 | 人妻少妇久久中文字幕 | 噜噜噜久久 | 欧美在线观看一区 | 日韩大片免费在线观看 | jizz免费视频 | 国产欧美在线一区 | 在线播放日韩av | 国产精品v日韩精品v在线观看 | 日本少妇裸体做爰高潮片 | 色淫湿视频| 向着小小的花蕾绽放 | 欧美一级免费在线观看 | 人人草人人草 | 影音先锋成人资源网 | 丁香综合网 | jizz中国少妇 | 成年人毛片 |