本文介绍: 使用 Go 语言统计 0-200000的数字中,哪些是素数?单循环遍历 1-200000 数字,并判断是否是素数。等待所有 Goroutine 执行完毕。来协调 Goroutine 的执行。创造多个协程处理写入读取通道。
题目
使用 Go 语言统计 0-200000的数字中,哪些是素数?
思路
两种方法:
-
单循环遍历 1-200000 数字,并判断是否是素数。
-
使用了 Goroutine 和通道实现并发:
-
通过创建两个通道
intChan
和primeChan
,以及一个sync.WaitGroup
来协调 Goroutine 的执行。 -
然后,启动三个 Goroutine:
InputIntChan
:向intChan
通道中写入整数数据。PrimeCompute
:从intChan
通道中读取整数数据,并判断是否为素数,将素数写入primeChan
通道。- readPrimeChan
:从
primeChan通道中读取素数数据并输出。
最后,使用
sync.WaitGroup
等待所有 Goroutine 执行完毕。
-
代码实现
单循环实现
package main
import (
"fmt"
"math"
"time"
)
func main() {
start := time.Now().Unix() // 记录开始时间
primeChan := make(chan int, 2000000) // 创建一个缓冲大小为2000000的素数通道
for i := 0; i <= 200000; i++ { // 判断从0到200000的整数是否为素数
if isPrime(i) { // 如果是素数
primeChan <- i // 写入素数通道
}
}
end := time.Now().Unix() // 记录结束时间
fmt.Println("总耗时时间:", end-start) // 输出总耗时时间
}
// 判断一个整数是否为素数
func isPrime(n int) bool {
if n <= 1 {
return false
}
for i := 2; i <= int(math.Sqrt(float64(n))); i++ { // 只需遍历到sqrt(n)即可,减少计算量
if n%i == 0 {
return false
}
}
return true
}
Goroutine 和通道实现
好的,以下是给代码加上注释后的版本:
package main
import (
"fmt"
"math"
"strconv"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(3)
intChan := make(chan int, 1000) // 创建一个缓冲大小为1000的整数型通道
primeChan := make(chan int, 2000000) // 创建一个缓冲大小为2000000的整数型通道
go InputIntChan(intChan, &wg) // 启动写入整数的协程
go PrimeCompute(intChan, primeChan, &wg) // 启动计算素数并写入素数通道的协程
go readIntChan(primeChan, &wg) // 启动读取素数并输出的协程
wg.Wait() // 等待所有协程结束
}
// 判断一个整数是否为素数
func isPrime(n int) bool {
if n <= 1 {
return false
}
for i := 2; i <= int(math.Sqrt(float64(n))); i++ { // 只需遍历到sqrt(n)即可,减少计算量
if n%i == 0 {
return false
}
}
return true
}
// 往通道中写入整数
func InputIntChan(intChan chan<- int, wg *sync.WaitGroup) {
for i := 0; i <= 200000; i++ { // 写入200000个整数
intChan <- i // 写入整数通道
fmt.Println("写入Int通道==" + strconv.Itoa(i))
}
close(intChan) // 写入完成,关闭通道
wg.Done() // 协程结束,减少计数器
}
// 判断整数是否为素数,并往素数通道中写入素数
func PrimeCompute(intChan <-chan int, primeChan chan<- int, wg *sync.WaitGroup) {
for i := range intChan { // 循环判断每个整数是否为素数
if isPrime(i) {
primeChan <- i // 如果是素数,往素数通道中写入素数
}
}
close(primeChan) // 计算完毕,关闭素数通道
wg.Done() // 协程结束,减少计数器
}
// 从素数通道中读取素数并输出
func readIntChan(primeChan <-chan int, wg *sync.WaitGroup) {
for i := range primeChan { // 循环读取素数通道中的素数
fmt.Println("从通道中读取素数==" + strconv.Itoa(i))
}
wg.Done() // 协程结束,减少计数器
}
优化思路
创造多个协程处理写入读取通道
原文地址:https://blog.csdn.net/qq_20185737/article/details/135662992
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_57724.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。