网站开发过程的需求分析,无锡鸿源建设集团有限公司网站,wordpress怎么安装多说,自己设计的网站如何推广题目
使用 Go 语言统计 0-200000的数字中#xff0c;哪些是素数#xff1f;
思路
两种方法#xff1a; 单循环遍历 1-200000 数字#xff0c;并判断是否是素数。 使用了 Goroutine 和通道实现并发#xff1a; 通过创建两个通道 intChan 和 primeChan#xff0c;以及一…题目
使用 Go 语言统计 0-200000的数字中哪些是素数
思路
两种方法 单循环遍历 1-200000 数字并判断是否是素数。 使用了 Goroutine 和通道实现并发 通过创建两个通道 intChan 和 primeChan以及一个 sync.WaitGroup 来协调 Goroutine 的执行。 然后启动三个 Goroutine InputIntChan向 intChan 通道中写入整数数据。PrimeCompute从 intChan 通道中读取整数数据并判断是否为素数将素数写入 primeChan 通道。readPrimeChan从 primeChan 通道中读取素数数据并输出。 最后使用 sync.WaitGroup 等待所有 Goroutine 执行完毕。
代码实现
单循环实现
package mainimport (fmtmathtime
)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 mainimport (fmtmathstrconvsync
)func main() {var wg sync.WaitGroupwg.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() // 协程结束减少计数器
}优化思路
创造多个协程处理写入读取通道