go携程算法:1-120万数里面的素数
浏览量:87
没有面试就在家学习学习吧,万一遇见合适的,一次就面试成功
思路图:
程序算法:
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()
}
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。