ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-09 14:32:06  阅读:153  来源: 互联网

标签:协程 int 代码 chan intchan 素数 fmt


要求:

要求统计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")

}

 

标签:协程,int,代码,chan,intchan,素数,fmt
来源: https://www.cnblogs.com/zmrgod/p/15874829.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有