Golang中的素数计数问题探讨

Golang中的素数计数问题探讨 我正在尝试创建一个函数,用于返回素数的总计数,但我遇到的问题是它对于像3或4这样的情况无法正常工作。你能告诉我哪里出错了吗? n = 10

func primeNumber(n int) int { 

    var totalNumberOfPrimes int
    
    for i := 2; i <= n/2; i++ {
        
        if n%i == 0 {
            fmt.Printf("The value is the not prime %v \n", i)
            
        }
        totalNumberOfPrimes++
    }
    
    return totalNumberOfPrimes
}

更多关于Golang中的素数计数问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

JOhn_Stuart:

for i := 2; i < testUntil; i++ { 替换为 i <= testUntil

在你的修改之后,代码仍然是错误的。

更多关于Golang中的素数计数问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是我以前写的一个代码片段,可以帮助你找到更简单的解决方案。 https://play.golang.org/p/Lm2DawMbzlu

创建一个能返回素数总数的函数。

解决方案是实现埃拉托斯特尼筛法。

埃拉托斯特尼筛法是一种古老的算法,用于找出所有不超过给定上限的素数。

维基百科:埃拉托斯特尼筛法

这里是我的一段旧代码片段,希望能帮助你找到更简单的解决方案。 https://play.golang.org/p/Lm2DawMbzlu

这段代码是错误的:它把 x*x 当成了质数。例如,它会返回 25 是质数。你应该把 for i := 2; i < testUntil; i++ { 替换为 i <= testUntil

你的代码存在几个问题。首先,你的函数名为 primeNumber,但它实际上是在计算某个范围内的数字,而不是判断单个数字是否为素数。其次,你的逻辑有误:你正在检查 n 是否能被 i 整除,但 totalNumberOfPrimes 却在每次循环中递增,这会导致计数错误。

以下是一个修正后的版本,它计算从 2 到 n 之间的素数数量:

func countPrimes(n int) int {
    if n < 2 {
        return 0
    }
    
    count := 0
    for num := 2; num <= n; num++ {
        isPrime := true
        for i := 2; i*i <= num; i++ {
            if num%i == 0 {
                isPrime = false
                break
            }
        }
        if isPrime {
            count++
        }
    }
    return count
}

如果你想要一个更高效的版本,可以使用埃拉托斯特尼筛法:

func countPrimesSieve(n int) int {
    if n < 2 {
        return 0
    }
    
    isPrime := make([]bool, n+1)
    for i := 2; i <= n; i++ {
        isPrime[i] = true
    }
    
    for i := 2; i*i <= n; i++ {
        if isPrime[i] {
            for j := i * i; j <= n; j += i {
                isPrime[j] = false
            }
        }
    }
    
    count := 0
    for i := 2; i <= n; i++ {
        if isPrime[i] {
            count++
        }
    }
    return count
}

调用示例:

func main() {
    n := 10
    fmt.Println(countPrimes(n))        // 输出: 4 (素数: 2, 3, 5, 7)
    fmt.Println(countPrimesSieve(n))   // 输出: 4
}
回到顶部