亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

Go語(yǔ)言實(shí)現(xiàn)埃拉托斯特尼篩法:一個(gè)修正后的版本

花韻仙語(yǔ)
發(fā)布: 2025-07-22 17:22:01
原創(chuàng)
434人瀏覽過(guò)

go語(yǔ)言實(shí)現(xiàn)埃拉托斯特尼篩法:一個(gè)修正后的版本

本文旨在幫助開發(fā)者理解并實(shí)現(xiàn)埃拉托斯特尼篩法,用于高效地找出一定范圍內(nèi)的所有質(zhì)數(shù)。我們將分析一個(gè)存在問題的Go語(yǔ)言實(shí)現(xiàn),找出并修復(fù)其中的錯(cuò)誤,并提供一個(gè)可正確運(yùn)行的版本,以便讀者更好地掌握該算法的原理和實(shí)現(xiàn)細(xì)節(jié)。

埃拉托斯特尼篩法簡(jiǎn)介

埃拉托斯特尼篩法是一種古老而高效的算法,用于找出給定范圍內(nèi)的所有質(zhì)數(shù)。其基本思想是從2開始,將每個(gè)質(zhì)數(shù)的倍數(shù)標(biāo)記為合數(shù)(非質(zhì)數(shù)),直到達(dá)到指定的范圍。剩余未被標(biāo)記的數(shù)字即為質(zhì)數(shù)。

問題分析與修復(fù)

原始代碼存在一個(gè)關(guān)鍵錯(cuò)誤,導(dǎo)致篩選結(jié)果不正確。錯(cuò)誤位于sieve函數(shù)內(nèi)部的內(nèi)層循環(huán)的起始條件:

for j := i; j < len(numCopy); j++ {
  if numCopy[j] % numCopy[i] != 0 || j == i {
   sievedNumbers = append(sievedNumbers, numCopy[j])
  }
}
登錄后復(fù)制

該循環(huán)從j = i開始,這意味著它會(huì)跳過(guò)numCopy[i]之前的元素,從而導(dǎo)致某些合數(shù)沒有被正確地排除。例如,當(dāng)i = 0時(shí),numCopy[i]為2,循環(huán)應(yīng)該從j = 0開始,檢查所有元素是否能被2整除。

立即學(xué)習(xí)go語(yǔ)言免費(fèi)學(xué)習(xí)筆記(深入)”;

正確的做法是將內(nèi)層循環(huán)的起始條件改為j = 0:

法語(yǔ)寫作助手
法語(yǔ)寫作助手

法語(yǔ)助手旗下的AI智能寫作平臺(tái),支持語(yǔ)法、拼寫自動(dòng)糾錯(cuò),一鍵改寫、潤(rùn)色你的法語(yǔ)作文。

法語(yǔ)寫作助手31
查看詳情 法語(yǔ)寫作助手
for j := 0; j < len(numCopy); j++ {
  if numCopy[j] % numCopy[i] != 0 || j == i {
   sievedNumbers = append(sievedNumbers, numCopy[j])
  }
}
登錄后復(fù)制

修正后的代碼

以下是修正后的Go語(yǔ)言代碼:

package main

import "fmt"

func main() {
    primes := sieve(makeNumbers(29))
    fmt.Printf("%v\n", primes)
}

func makeNumbers(n int) []int {
    numbers := make([]int, n-1)
    for i := 0; i < len(numbers); i++ {
        numbers[i] = i + 2
    }
    return numbers
}

func sieve(numbers []int) []int {
    numCopy := numbers
    max := numbers[len(numbers)-1]
    sievedNumbers := make([]int, 0)
    for i := 0; i < len(numCopy) && numCopy[i]*numCopy[i] <= max; i++ {
        for j := 0; j < len(numCopy); j++ {
            if numCopy[j]%numCopy[i] != 0 || j == i {
                sievedNumbers = append(sievedNumbers, numCopy[j])
            }
        }
        numCopy = sievedNumbers
        sievedNumbers = make([]int, 0)
    }
    return numCopy
}
登錄后復(fù)制

代碼解釋

  1. makeNumbers(n int) []int: 此函數(shù)生成一個(gè)包含從2到n的整數(shù)切片。
  2. sieve(numbers []int) []int: 此函數(shù)實(shí)現(xiàn)了埃拉托斯特尼篩法。
    • numCopy := numbers: 創(chuàng)建一個(gè)numbers的副本,避免修改原始切片。
    • max := numbers[len(numbers)-1]: 獲取numbers切片中的最大值。
    • sievedNumbers := make([]int, 0): 創(chuàng)建一個(gè)空切片,用于存儲(chǔ)篩選后的數(shù)字。
    • 外層循環(huán)遍歷numCopy,直到當(dāng)前數(shù)字的平方大于max。
    • 內(nèi)層循環(huán)遍歷numCopy,檢查每個(gè)數(shù)字是否能被numCopy[i]整除。如果不能整除,或者當(dāng)前數(shù)字就是numCopy[i]本身(j == i),則將該數(shù)字添加到sievedNumbers切片中。
    • 循環(huán)結(jié)束后,將sievedNumbers賦值給numCopy,并清空sievedNumbers,為下一輪篩選做準(zhǔn)備。
  3. main(): 主函數(shù)調(diào)用makeNumbers生成數(shù)字切片,然后調(diào)用sieve進(jìn)行篩選,最后打印結(jié)果。

運(yùn)行結(jié)果

運(yùn)行修正后的代碼,將得到以下輸出:

[2 3 5 7 11 13 17 19 23 29]
登錄后復(fù)制

這與預(yù)期結(jié)果一致,表明代碼已成功修正。

注意事項(xiàng)與總結(jié)

  • 埃拉托斯特尼篩法的時(shí)間復(fù)雜度為O(n log log n),是一種非常高效的質(zhì)數(shù)篩選算法。
  • 在實(shí)現(xiàn)該算法時(shí),需要注意循環(huán)的起始條件,以確保所有合數(shù)都被正確地排除。
  • 可以使用更高級(jí)的數(shù)據(jù)結(jié)構(gòu),例如位圖,來(lái)進(jìn)一步優(yōu)化算法的性能。
  • 該算法的空間復(fù)雜度取決于要篩選的數(shù)字范圍。對(duì)于非常大的范圍,可能需要考慮使用分段篩法來(lái)減少內(nèi)存占用。

通過(guò)本文的分析和修正,讀者應(yīng)該能夠更好地理解和掌握埃拉托斯特尼篩法的原理和實(shí)現(xiàn),并能夠在自己的項(xiàng)目中應(yīng)用該算法。

以上就是Go語(yǔ)言實(shí)現(xiàn)埃拉托斯特尼篩法:一個(gè)修正后的版本的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件
最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件

每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。

下載
來(lái)源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)