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