## Golang多核判断素数方式

  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. "runtime"
  8. "strconv"
  9. "syscall"
  10. )
  11.  
  12. func main() {
  13. //开启真多核
  14. runtime.GOMAXPROCS(runtime.NumCPU())
  15. intchan := make(chan int, 10000) //向intchan内写入若干个数字,判断这些数字是否为质数
  16. final := make(chan int, 10000) //结果集,质数都放在里面
  17. exitchan := make(chan bool, 5) //当收集到5个true时,程序即可结束
  18.  
  19. // 开启协程,向intchan放入数据(1-10000)
  20. go func(intchan chan int) {
  21. for i := 2; i <= 10000; i++ {
  22. intchan <- i
  23. }
  24.  
  25. }(intchan)
  26.  
  27. //开启四个正经工作的协程,他们来判断谁是质数
  28. for c := 1; c < 5; c++ {
  29. go countprime(intchan, final, exitchan, c)
  30. }
  31.  
  32. // 从结果集合中写入文件
  33. go func(final chan int, exitchan chan bool) {
  34. file, _ := os.OpenFile("prime.txt", syscall.O_APPEND, 1)
  35. defer file.Close()
  36. defer close(final)
  37. writer := bufio.NewWriter(file)
  38. n := 500
  39. for {
  40. num := <-final
  41. if num == 10000 {
  42. exitchan <- true
  43. break
  44. }
  45. writer.WriteString(strconv.Itoa(num))
  46. writer.WriteString(",")
  47. // 多个协程共同工作,所以返回数不是递增的,所以这种分行方式非常不好用
  48. if num > n {
  49. writer.WriteString("\n")
  50. n = num + 500
  51. }
  52. writer.Flush()
  53.  
  54. }
  55. }(final, exitchan)
  56.  
  57. // 读出5个数据后,代表所有协程都工作完毕,可以关闭程序
  58. for v := 1; v < 6; v++ {
  59. <-exitchan
  60. }
  61. close(exitchan)
  62. fmt.Println("程序结束.")
  63. }
  64.  
  65. func countprime(intchan chan int, final chan int, exit chan bool, t int) {
  66. ISPRIME:
  67. for {
  68. num, ok := <-intchan
  69. if !ok {
  70. break
  71. }
  72. if num == 10000 {
  73. final <- 10000
  74. close(intchan)
  75. break
  76. } else {
  77. num2 := num
  78. for i := 2; i < num2; i++ {
  79. //降低时间复杂度,正经判断素数不用这种方式
  80. num2 = num / i
  81. if num%i == 0 {
  82. continue ISPRIME
  83. }
  84. }
  85. final <- num
  86. }
  87. }
  88. fmt.Println(t, "号协程完成工作")
  89. exit <- true
  90. }

缺陷:

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. java 内存分析之this

    package Demo; /** * this 的值是当前对象的引用 * @author Aaron * */ public class Boy { private int age; public ...

  2. 本地sql大文件导入数据库

    mysql中配置my.ini interactive_timeout = 120 wait_timeout = 120 max_allowed_packet = 32M 导入sql运行命令 sourc ...

  3. Oracle EBS AP 供应商取值

    SELECT --nvl(substr(po.vendor_name,1,instr(po.vendor_name,',',1)-1),po.vendor_name) vendor_name, po. ...

  4. python相关知识/技巧文摘

    python文件和目录操作 python连接mysql数据库 Python字符编码详解 unicode相关介绍

  5. HashMap集合特点

      >HashMap集合特点 HashMap:是基于哈希表的Map接口实现. 哈希表的作用是用来保证键的唯一性的.          不明白,直接看HashMap的put方法源码 //HashM ...

  6. oracle 数据库数据备份

    oracle 数据库数据备份 1.使用oracle用户应该就可以进行数据备份(不需要root用户):su oracle 查oracle实例名:echo $ORACLE_SID       例如查出来的 ...

  7. 4-urllib库添加代理,添加请求头格式 模板

    urllib 库设置代理的方法 案例如下:

  8. 第一篇,编译生成libcef_dll_wrapper

    因为工作原因需要在程序里面嵌入地图,在网上看了百度地图和高德地图都没有提供c++的接口,提供有web接口,那只好在程序里面嵌入web控件了,第一想到的是web browser控件,接着脑海里又想到IE ...

  9. Keepalived 实现双机热备

    原理 首先有一个虚拟ip暴露给客户端,虚拟ip对应的mac地址为一台真实服务器, 即用户向虚拟ip发送一个请求,该请求会被分发到真实服务器上. 现在有2台真实服务器,一台master,一台backup ...

  10. 【原创】python requests 库底层Sockets处于close_wait状态

    以前对于Requests库只是简单是使用,在现在公司的后台中,有多个接口是直接使用requests.get .post之类的方法来做的,进行过一段时间的压力测试,发现性能低的可怜,且linux服务器有 ...