本文旨在幫助開發(fā)者理解并實(shí)現(xiàn)埃拉托斯特尼篩法,用于高效地找出一定范圍內(nèi)的所有質(zhì)數(shù)。我們將分析一個(gè)存在問題的Go語(yǔ)言實(shí)現(xiàn),找出并修復(fù)其中的錯(cuò)誤,并提供一個(gè)可正確運(yùn)行的版本,以便讀者更好地掌握該算法的原理和實(shí)現(xiàn)細(xì)節(jié)。
埃拉托斯特尼篩法是一種古老而高效的算法,用于找出給定范圍內(nèi)的所有質(zhì)數(shù)。其基本思想是從2開始,將每個(gè)質(zhì)數(shù)的倍數(shù)標(biāo)記為合數(shù)(非質(zhì)數(shù)),直到達(dá)到指定的范圍。剩余未被標(biāo)記的數(shù)字即為質(zhì)數(shù)。
原始代碼存在一個(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]) } }
該循環(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:
for j := 0; j < len(numCopy); j++ { if numCopy[j] % numCopy[i] != 0 || j == i { sievedNumbers = append(sievedNumbers, numCopy[j]) } }
以下是修正后的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 }
運(yùn)行修正后的代碼,將得到以下輸出:
[2 3 5 7 11 13 17 19 23 29]
這與預(yù)期結(jié)果一致,表明代碼已成功修正。
通過(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)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)