晓夏

北漂的女孩

Good Luck To You!

go携程算法:1-120万数里面的素数

浏览量:70

没有面试就在家学习学习吧,万一遇见合适的,一次就面试成功

思路图:图片.png

程序算法:

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











神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。