关于golang:golang实现计算1到100000范围内的素数

5次阅读

共计 1201 个字符,预计需要花费 4 分钟才能阅读完成。

1. 计算 1 到 100000 范畴内的素数 golang 实现

package concurrentdemo

import (
    "fmt"
    "sync"
)

//1-10000000

var start int = 0 // 开始值

// var end int = 1000000 // 完结值
var end int = 1000
var interval int = 100 // 划分 goroutine 距离
var wg sync.WaitGroup 

func calResult(x int) bool { // 素数计算函数,返回 boolean 类型的值
    max := x/2 + 1
    result := true
    for i := 2; i < max; i++ {
        if x%i == 0 {
            result = false
            break
        }
    }
    return result
}

func startTask(start, end, interval int) { // 开始工作
    resultChan := make(chan int,10) // 素数计算后的后果放到 resultChan 中
    exitChan := make(chan bool,16) // 为了晓得各个 goroutine 执行结束,而后敞开 resultChan
    time := (end - start) / interval // 总 goroutine
    fmt.Printf("time:%d \n", time)
    for i := 1; i <= time; i++ {wg.Add(1)
        startTemp := (i-1)*interval + start
        endTemp := i * interval
        fmt.Printf("startTemp:%d,endTemp:%d \n", startTemp, endTemp)
        go resolve(startTemp, endTemp, resultChan,exitChan)
    }    
    wg.Add(1)
    go func ()  {
        for i := 1; i <= time; i++ {   // 循环取总 time 次
            <- exitChan
        }
        wg.Done()
        close(resultChan)  // 在所有 goroutine 将本人的范畴内的素数计算完之后,并发送到 resultChan 后,敞开 resultChan
    }()
    
    for v := range resultChan{fmt.Printf("result:%d \n",v)
    }
    
    fmt.Println("main finished")
    wg.Wait()}

func resolve(start, end int, resultChan chan<- int,exitChan chan<- bool) {
    for i := start; i < end; i++ {if calResult(i) {resultChan <- i}
    }
    exitChan <- true
    fmt.Printf("start:%d,end:%d finished \n", start, end)
    wg.Done()}

func ConcurrentDemoT() {startTask(start, end, interval)
}

2. 后果

正文完
 0