Golang并行判断素数
## 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并行判断素数的更多相关文章
- 快速判断素数 --Rabin-Miller算法
以前我在判断素数上一直只会 sqrt(n) 复杂度的方法和所谓的试除法(预处理出sqrt(n)以内的素数,再用它们来除). (当然筛选法对于判断一个数是否是素数复杂度太高) 现在我发现其实还有一种方法 ...
- 2java判断素数
package com.test; import java.math.*;import java.util.Scanner; public class test222 { /** * @param a ...
- filter运行出现 <filter object at 0x000001B68F052828> 判断素数
刚接触filter时 运行总是出现<filter object at 0x000001B68F052828> 得不到想要的数据 后来发现是因为filter的结果是一个数组 需要 lis ...
- 【递归入门】组合+判断素数:dfs(递归)
题目描述 已知 n 个整数b1,b2,…,bn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和. 例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- 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 ...
- 团体程序设计天梯赛-练习集-L1-028. 判断素数
L1-028. 判断素数 本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(<=10),随后N行,每行给出一个小于231的需要判断的正整数. 输出格 ...
- java高效判断素数
java高效判断素数 package solution; public class Prime { // 偶数可以由有两个素数相加得到, 一个偶数可能有多个这样的两个素数, 请寻找到 这样两个素数,让 ...
- PTA --- 天梯赛 L1-028 判断素数
L1-028 判断素数 (10 point(s)) 本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于231 ...
- 代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
package com.loaderman.Coding; /* 判断101-200之间有多少个素数(质数),并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能 ...
随机推荐
- redis 命令select、dbsize、清空数据库、info、client
select 切换库 dbsize 当前库中数据条数 清空数据库 flushdb | flushall 清空数据,一个是清空当前库,一个清空当前实例 查看服务器及redis相关信息 infoinfo ...
- mybatis 一对一 映射实体类、嵌套查询
一对一 在SysUser 类中增加SysRole字段.1.sql语句将role.role_name映射到role.roleName上. 2.还可以在XML 映射文件中配置结果映射.<result ...
- mysql 命令行查看数据库、创建数据库、选择数据库、删除数据库
mysql数据库命名规则(标识符规则): 不能和已存在的命名重名: 由大小写字母.数据.下划线.@.# 和 $ 符号组成: 首字母不能是数字和$符. 不允许有空格和特殊字符. 不允许是mysql的保留 ...
- java基础(四) java运算顺序的深入解析
1. 从左往右的计算顺序 与C/C++不同的是,在Java中,表达式的计算与结果是确定的,不受硬件与环境的影响.如: int i = 5; int j = (i++) + (i++) +(i++) ...
- CMake中添加Qt模块的合理方法
https://www.jianshu.com/p/7eeb6f79a275 转载自这里 用CMake来组织的工程中要用Qt首先要设置.找到Qt相关模块.主要是通过find_package这个CMak ...
- OpenLDAP权限配置
安装好了openldap之后,就是对它进行配置了,其中一项就是设置访问控制,限制普通用户只能修改/访问他们能修改/访问的项.这就是ACL需要做的事情. 设置方法 1.可以将 include行放在/et ...
- 软工读书笔记 week 6 ——《疯狂的程序员》Part 1
这本小说以主人公绝影上大学后初次接触编程开始讲起,这周主要看的就是绝影还在大学的那段经历,虽然故事背景很多年前,但很多地方仍然会引发我的共鸣. 第一个梦想 在“第一个梦想”一节讲了作业布置做一个通讯录 ...
- leetCode题解 Student Attendance Record I
1.题目描述 You are given a string representing an attendance record for a student. The record only conta ...
- python是如何找到对应的package的?
我们在写python代码或者阅读别人的代码时,可能会碰到对应module无法找到的问题,这时如何解决呢?我们如果对python解释器如何查找对应的module有比较深刻的理解,那么我们就可以轻松解决相 ...
- Oracle EBS 获取用户挂的职责 请求 请求的类别(RTF还是什么的)
select fu.user_ID, fu.user_name, fu.start_date, fu.END_DATE, fu.description, fe.last_name, fr.RESPON ...