## Golang多核判断素数方式

 package main

 import (
"bufio"
"fmt"
"os"
"runtime"
"strconv"
"syscall"
) func main() {
//开启真多核
runtime.GOMAXPROCS(runtime.NumCPU())
intchan := make(chan int, 10000) //向intchan内写入若干个数字,判断这些数字是否为质数
final := make(chan int, 10000) //结果集,质数都放在里面
exitchan := make(chan bool, 5) //当收集到5个true时,程序即可结束 // 开启协程,向intchan放入数据(1-10000)
go func(intchan chan int) {
for i := 2; i <= 10000; i++ {
intchan <- i
} }(intchan) //开启四个正经工作的协程,他们来判断谁是质数
for c := 1; c < 5; c++ {
go countprime(intchan, final, exitchan, c)
} // 从结果集合中写入文件
go func(final chan int, exitchan chan bool) {
file, _ := os.OpenFile("prime.txt", syscall.O_APPEND, 1)
defer file.Close()
defer close(final)
writer := bufio.NewWriter(file)
n := 500
for {
num := <-final
if num == 10000 {
exitchan <- true
break
}
writer.WriteString(strconv.Itoa(num))
writer.WriteString(",")
// 多个协程共同工作,所以返回数不是递增的,所以这种分行方式非常不好用
if num > n {
writer.WriteString("\n")
n = num + 500
}
writer.Flush() }
}(final, exitchan) // 读出5个数据后,代表所有协程都工作完毕,可以关闭程序
for v := 1; v < 6; v++ {
<-exitchan
}
close(exitchan)
fmt.Println("程序结束.")
} func countprime(intchan chan int, final chan int, exit chan bool, t int) {
ISPRIME:
for {
num, ok := <-intchan
if !ok {
break
}
if num == 10000 {
final <- 10000
close(intchan)
break
} else {
num2 := num
for i := 2; i < num2; i++ {
//降低时间复杂度,正经判断素数不用这种方式
num2 = num / i
if num%i == 0 {
continue ISPRIME
}
}
final <- num
}
}
fmt.Println(t, "号协程完成工作")
exit <- true
}

缺陷:

1.  判断素数的方法很low,有更好的数学方法降维打击

2.  结束程序的方式很差,有可能(几乎必然)漏掉末尾几个素数无法录入

Golang并行判断素数的更多相关文章

  1. 快速判断素数 --Rabin-Miller算法

    以前我在判断素数上一直只会 sqrt(n) 复杂度的方法和所谓的试除法(预处理出sqrt(n)以内的素数,再用它们来除). (当然筛选法对于判断一个数是否是素数复杂度太高) 现在我发现其实还有一种方法 ...

  2. 2java判断素数

    package com.test; import java.math.*;import java.util.Scanner; public class test222 { /** * @param a ...

  3. filter运行出现 <filter object at 0x000001B68F052828> 判断素数

    刚接触filter时  运行总是出现<filter object at 0x000001B68F052828>  得不到想要的数据 后来发现是因为filter的结果是一个数组 需要 lis ...

  4. 【递归入门】组合+判断素数:dfs(递归)

    题目描述 已知 n 个整数b1,b2,…,bn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和. 例如当 n=4,k=3,4 个整数分别为 3,7,12, ...

  5. HDU 2138 How many prime numbers(Miller_Rabin法判断素数 【*模板】 用到了快速幂算法 )

    How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  6. 团体程序设计天梯赛-练习集-L1-028. 判断素数

    L1-028. 判断素数 本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(<=10),随后N行,每行给出一个小于231的需要判断的正整数. 输出格 ...

  7. java高效判断素数

    java高效判断素数 package solution; public class Prime { // 偶数可以由有两个素数相加得到, 一个偶数可能有多个这样的两个素数, 请寻找到 这样两个素数,让 ...

  8. PTA --- 天梯赛 L1-028 判断素数

    L1-028 判断素数 (10 point(s))   本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2​31​ ...

  9. 代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

    package com.loaderman.Coding; /* 判断101-200之间有多少个素数(质数),并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能 ...

随机推荐

  1. ubuntu 命令、linux环境变量设置

    解压与压缩: tar.gz格式tar -xzvf xxx jar格式jar -xvf xxx.jar zip格式unzip xxx.zip zip -r xxx.zip xxx unarunar -e ...

  2. CSS3 响应式web设计,CSS3 Media Queries

    两种方式,一种是直接在link中判断设备的尺寸,然后引用不同的css文件: <link rel="stylesheet" type="text/css" ...

  3. Java 两个日期间的天数计算

    在Java中计算两个日期间的天数,大致有2种方法:一是使用原生JDK进行计算,在JDK8中提供了更为直接和完善的方法:二是使用第三方库. 1.使用原生的JDK private static long  ...

  4. form插件ajaxForm和ajaxSubmit方法传递对象参数说明

    form插件的ajaxForm和ajaxSubmit方法的Options对象还可以用来将值传递给jQuery的$.ajax方法.如果你熟悉$.ajax所支持的options,你可以利用它们来将Opti ...

  5. 使用GTID给Galera集群做数据库异步复制

    一.为什么要做Galera集群异步复制 Galera集群解决了数据库高可用的问题,但是存在局限性,例如耗时的事务处理可能会导致集群性能急剧下降,甚至出现阻塞现象.而不幸的是,类似报表等业务需求就需要做 ...

  6. 转载:从程序员的角度看ASCII, GB2312, UNICODE, UTF-8

    以下内容转自博客:http://blog.chinaunix.net/uid-22670933-id-1771613.html. 一.字符编码是怎么回事 0. 概念 字节是计算机的最基本存储单位,一个 ...

  7. How HashMap works in Java

    https://www.javainterviewpoint.com/hashmap-works-internally-java/ How a HashMap Works internally has ...

  8. [转]CentOS7增加或修改SSH端口号

    前言:开启某服务或软件的端口,要从该服务或软件监听的端口(多以修改配置文件为主),SeLinux和防火墙(FireWall)的安全策略下手.如果使用阿里云,腾讯等第三方服务器还需要对管理控制台的安全组 ...

  9. 记Git报错-Everything up-to-date

    文:铁乐与猫 今天git push 到github远程仓库的时候,出现报错"Everything up-to-date",严格来说也不算报错,它只是在告诉你,提交区所有的东西都是最 ...

  10. mac lnmp

    Mac下安装LNMP(Nginx+PHP5.6)环境 Mac下安装LNMP(Nginx+PHP5.6)环境 安装Homebrew 最近工作环境切换到Mac,所以以OS X Yosemite(10.10 ...