go携程算法:1-120万数里面的素数
浏览量:70
没有面试就在家学习学习吧,万一遇见合适的,一次就面试成功
思路图:
程序算法:
package main import ( "fmt" "sync" ) var wg sync.WaitGroup func main() { //存入12万数据 测试的可以少些 ichan := make(chan int, 1000) //12数据的素数 pchan := make(chan int, 1000) //判断chan是否可以关闭 exitchan := make(chan bool, 16) //标识chan 结束 wg.Add(1) n := 100 go putNumber(ichan, n) //判断12万数据店里面的素数 for i := 0; i < 16; i++ { wg.Add(1) go pNumber(ichan, pchan, exitchan) } //打印素数 wg.Add(1) go fmtNumber(pchan) //因为判断素数开启了16个协程,不能直接在方法里面关闭,需要判断是否可以关闭 wg.Add(1) //关闭协程 go func() { for i := 0; i < 16; i++ { <-exitchan } //关闭pchan close(pchan) wg.Done() }() wg.Wait() fmt.Println("结束数据") } // 2-n的所有数据 写入ichan func putNumber(ichan chan int, n int) { for i := 2; i <= n; i++ { ichan <- i } close(ichan) wg.Done() } // ichan里面取值,判断是不是素数 func pNumber(ichan chan int, pchan chan int, exitchan chan bool) { for val := range ichan { var flag = true for i := 2; i < val; i++ { if val%i == 0 { flag = false break } } if flag { pchan <- val } } wg.Done() //多个协程什么时候关闭chan,不能直接关闭,因为开16个协程,所以需要判断在去关闭 //close(pchan) //新加一个管道,用来记录协程挂你 exitchan <- true } // 输出素数 func fmtNumber(pchan chan int) { for num := range pchan { fmt.Println(num) } wg.Done() }
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。