使用协程对素数判断思路和代码实现

要求:

要求统计1-8000的数组当中哪些是素数?现在我们使用goroutine和channel知识完成

package main

import (
    "fmt"
    "time"
)
func putNum(intchan chan int) {
    for i := 1; i <= 8000; i++ {
        intchan <- i
    }
    close(intchan)
}

func primeNum(intchan chan int, primechan chan int, exitchan chan bool) {
    //使用for循环取出数据进行判断
    var flag bool //标记符
    for {
        flag = true //假设是素数
        time.Sleep(time.Millisecond * 10)
        num, ok := <-intchan
        if !ok {
            break
        }
        for j := 2; j < num; j++ {
            if num%j == 0 { //说明num不是素数
                flag = false
                break
            }
        }
        if flag {
            //是素数就把数据放入到存放素数的管道
            primechan <- num
        }

    }
    fmt.Println("有一个primeNum 协程因为取不到数据退出")
    //现在还不能关闭管道,因为要开启四个协程同时取数据
    exitchan <- true
}

func main() {
    intchan := make(chan int, 1000)
    primechan := make(chan int, 2000)
    exitchan := make(chan bool, 4)
    go putNum(intchan)
    //同时开启四个协程
    for i := 0; i < 4; i++ {
        go primeNum(intchan, primechan, exitchan)
    }

    go func() {
        for i := 0; i < 4; i++ {
            <-exitchan
        }
        close(primechan)
    }()
    for {
        //使用for循环取出primechan中的数据
        val, ok := <-primechan
        if !ok {
            break
        }
        fmt.Printf("素数=%v\n", val)
    }
    fmt.Println("main down")

}

 

上一篇:Ubuntu U-boot移植编译错误 [Error: You must add new CONFIG options using Kconfig]


下一篇:苹果地图为三个欧洲国家提供交通数据 服务范围扩大