在编程和算法学习中,质数(又称素数)是一个非常基础又重要的概念。质数是指大于1且只能被1和自身整除的自然数,比如2、3、5、7等。当我们需要快速找出某个范围内的所有质数时,暴力逐个判断效率很低。这时,埃拉托斯特尼筛法(简称埃氏筛)就派上用场了!
本文将手把手教你用Go语言实现埃氏筛法,即使你是编程小白,也能轻松理解并掌握这一经典算法。
埃氏筛法(Sieve of Eratosthenes)是由古希腊数学家埃拉托斯特尼在公元前250年左右提出的一种高效筛选质数的算法。它的核心思想是:从2开始,依次将每个质数的倍数标记为合数(非质数),剩下的未被标记的数就是质数。
下面我们用Go语言一步步实现这个算法。假设我们要找出小于等于 n 的所有质数。
isPrime,长度为 n+1,初始值全部设为 true。isPrime[0] = false 和 isPrime[1] = false。√n(因为大于 √n 的合数一定已经被更小的因数筛掉了)。i 是质数(即 isPrime[i] == true),则将其所有倍数(从 i*i 开始)标记为 false。true 的下标即为质数。package mainimport ( "fmt")// sieveOfEratosthenes 使用埃氏筛法找出小于等于n的所有质数func sieveOfEratosthenes(n int) []int { if n < 2 { return []int{} } // 创建布尔切片,初始全部为true isPrime := make([]bool, n+1) for i := range isPrime { isPrime[i] = true } // 0和1不是质数 isPrime[0] = false isPrime[1] = false // 从2开始筛选 for i := 2; i*i <= n; i++ { if isPrime[i] { // 将i的所有倍数标记为非质数 for j := i * i; j <= n; j += i { isPrime[j] = false } } } // 收集所有质数 primes := []int{} for i, prime := range isPrime { if prime { primes = append(primes, i) } } return primes}func main() { n := 30 primes := sieveOfEratosthenes(n) fmt.Printf("小于等于 %d 的所有质数为:%v\n", n, primes)} 当你运行上述代码时,输出将是:
小于等于 30 的所有质数为:[2 3 5 7 11 13 17 19 23 29]
相比对每个数单独判断是否为质数(时间复杂度约为 O(n√n)),埃氏筛法的时间复杂度为 O(n log log n),空间复杂度为 O(n)。对于大范围的质数筛选(如 n = 1,000,000),效率提升非常明显。
通过本教程,你已经学会了如何用Go语言实现经典的埃氏筛法来高效筛选质数。这项技能不仅适用于算法面试,也能在实际项目中用于优化涉及质数计算的场景。
记住这几个SEO关键词有助于你后续搜索相关内容:Go语言质数筛选、埃氏筛法教程、Go实现埃拉托斯特尼筛、高效求质数算法。
动手试试吧!修改 n 的值,看看不同范围下的质数结果。编程的乐趣就在于实践!
本文由主机测评网于2025-12-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025127759.html