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
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
}

