Golang 使用并发计算给定数字以内的所有质数

Golang 使用并发计算给定数字以内的所有质数

在这篇Go语言文章中,我们将编写程序来使用并发执行计算给定数字以内的所有质数。并发执行是同时执行多个任务的过程。在Golang中,使用go程和通道来创建并发程序。

Go程是由Go运行时管理的轻量级线程,而通道则有助于在Go程之间进行无冲突的通信。

语法

func make ([] type, size, capacity)

make 函数在Go语言中用来创建一个数组/映射。它接收要创建的变量的类型、大小和容量作为参数。

func range(variable)

range函数用于迭代任何数据类型。要使用它,我们首先需要编写range关键字,后跟我们想要迭代的数据类型,结果是循环将迭代到变量的最后一个元素。

步骤

  • 在程序中导入main、fmt和sync包

  • 创建一个主函数

  • 在主函数中设置范围,限制素数计算的上限值

  • 然后,使用make函数创建一个名为primes的通道,用于获取素数

  • 在这一步中,创建一个Wait Group wg,以便在退出主函数之前所有的go routine都完成

  • 然后,通过调用generatePrimes函数来启动go routine

  • 在这里,将限制、primes通道和wg作为参数传递

  • 启动另一个go routine来打印素数,通过调用printPrimes函数

  • 在这里,将primes通道和Wait Group作为参数传递

  • 然后,使用wait函数等待所有的go routine完成

  • 在这一步中,创建一个generatePrimes函数来生成给定限制范围内的素数

  • 在这个函数中,将初始素数2和3发送到primes通道。然后,在步长为2的情况下,从5迭代到限制范围

  • 在每次迭代中,通过从3迭代到该数字的平方根来检查质数性

  • 如果数字能被其中任何一个除数整除,则它不是一个质数,Prime设置为false。否则,它仍为true

  • 如果数字是质数,则将其发送到primes通道

  • 创建printPrimes函数来接收primes通道中的质数并打印它们

  • 一旦打印完所有数字,调用wg.Done()来通知Wait Group已经完成打印

  • 在所有go routine完成后,程序结束

示例

在这个示例中,我们将编写一个Go程序,使用go routine和channel计算所有素数,以实现并发执行。

package main
import (
    "fmt"
    "sync"
)
func main() {   
    limit := 100
    primes := make(chan int)
    var wg sync.WaitGroup

    wg.Add(1)
    go generatePrimes(limit, primes, &wg)

    wg.Add(1)
    go printPrimes(primes, &wg)
    wg.Wait()
}
func generatePrimes(limit int, primes chan<- int, wg *sync.WaitGroup) {
    defer close(primes)
    defer wg.Done()
    primes <- 2
    primes <- 3
    for num := 5; num <= limit; num += 2 {
        isPrime := true     
        for i := 3; i*i <= num; i += 2 {
            if num%i == 0 {
                isPrime = false
                break
            }
        }
        if isPrime {
            primes <- num
        }
    }
}
func printPrimes(primes <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Println("The prime numbers till the rage of 100 are:")

    for prime := range primes {
        fmt.Println(prime)
    }
}

输出

The prime numbers till the rage of 100 are:
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

结论

我们利用一个示例编写并执行了计算小于给定数字的质数程序,使用了Go语言的Go routines和channels来实现并发。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程