我正在编写一个计算所有友好和完美数字的程序。
可悲的是我的代码有问题!
如果有人知道在计算完所有数字后如何停止程序,最好没有错误,请告诉我。
package main
import (
"fmt"
"strings"
)
func getDivisorSum(number int) int {
divisors := 0
for possibleDivisor := 1; possibleDivisor <= number / 2; possibleDivisor++ {
if number % possibleDivisor == 0 {
divisors += possibleDivisor
}
}
return divisors
}
func checkNumber(number int, channel chan string, done *int) {
first := getDivisorSum(number)
if first == number {
channel <- fmt.Sprintf("%d", number)
*done += 1
return
}
second := getDivisorSum(first)
if number == second {
channel <- fmt.Sprintf("%d:%d", number, first)
*done += 1
return
}
}
func checkNumberRange(min int, max int) {
channel := make(chan string)
done := 0
for number := min; number <= max; number++ {
go checkNumber(number, channel, &done)
}
for {
tmp := <- channel
if strings.Contains(tmp, ":") {
parts := strings.Split(tmp, ":")
fmt.Printf("%s is an amicable of %s!\n", parts[0], parts[1])
} else {
fmt.Printf("%s is perfect!\n", tmp)
}
}
}
func main() {
checkNumberRange(1, 65536)
}
此刻,程序死于死锁,位于>]
tmp := <- channel
谢谢你,Jooarye!
我正在编写一个计算所有友好和完美数字的程序。可悲的是我的代码有问题!如果有人知道在计算完所有数字后如何停止程序,...
您的程序有多个问题:
从通道读取将被阻止,直到有数据为止。您可以检查第二个返回值以断言通道是否已关闭。
我建议您阅读以下文章https://blog.golang.org/pipelines。