使用 Go 语言统计 0-200000 的数字中,哪些是素数?
题目
使用 Go 语言统计 0-200000的数字中,哪些是素数?
思路
两种方法:
-
单循环遍历 1-200000 数字,并判断是否是素数。
-
使用了 Goroutine 和通道实现并发:
-
通过创建两个通道
intChan和primeChan,以及一个sync.WaitGroup来协调 Goroutine 的执行。 -
然后,启动三个 Goroutine:
InputIntChan:向intChan通道中写入整数数据。PrimeCompute:从intChan通道中读取整数数据,并判断是否为素数,将素数写入primeChan通道。- readPrimeChan
:从primeChan通道中读取素数数据并输出。
最后,使用
sync.WaitGroup等待所有 Goroutine 执行完毕。
-
代码实现
单循环实现
package mainimport ("fmt""math""time"
)func main() {start := time.Now().Unix() // 记录开始时间primeChan := make(chan int, 2000000) // 创建一个缓冲大小为2000000的素数通道for i := 0; i <= 200000; i++ { // 判断从0到200000的整数是否为素数if isPrime(i) { // 如果是素数primeChan <- i // 写入素数通道}}end := time.Now().Unix() // 记录结束时间fmt.Println("总耗时时间:", end-start) // 输出总耗时时间
}// 判断一个整数是否为素数
func isPrime(n int) bool {if n <= 1 {return false}for i := 2; i <= int(math.Sqrt(float64(n))); i++ { // 只需遍历到sqrt(n)即可,减少计算量if n%i == 0 {return false}}return true
}
Goroutine 和通道实现
好的,以下是给代码加上注释后的版本:
package mainimport ("fmt""math""strconv""sync"
)func main() {var wg sync.WaitGroupwg.Add(3)intChan := make(chan int, 1000) // 创建一个缓冲大小为1000的整数型通道primeChan := make(chan int, 2000000) // 创建一个缓冲大小为2000000的整数型通道go InputIntChan(intChan, &wg) // 启动写入整数的协程go PrimeCompute(intChan, primeChan, &wg) // 启动计算素数并写入素数通道的协程go readIntChan(primeChan, &wg) // 启动读取素数并输出的协程wg.Wait() // 等待所有协程结束
}// 判断一个整数是否为素数
func isPrime(n int) bool {if n <= 1 {return false}for i := 2; i <= int(math.Sqrt(float64(n))); i++ { // 只需遍历到sqrt(n)即可,减少计算量if n%i == 0 {return false}}return true
}// 往通道中写入整数
func InputIntChan(intChan chan<- int, wg *sync.WaitGroup) {for i := 0; i <= 200000; i++ { // 写入200000个整数intChan <- i // 写入整数通道fmt.Println("写入Int通道==" + strconv.Itoa(i))}close(intChan) // 写入完成,关闭通道wg.Done() // 协程结束,减少计数器
}// 判断整数是否为素数,并往素数通道中写入素数
func PrimeCompute(intChan <-chan int, primeChan chan<- int, wg *sync.WaitGroup) {for i := range intChan { // 循环判断每个整数是否为素数if isPrime(i) {primeChan <- i // 如果是素数,往素数通道中写入素数}}close(primeChan) // 计算完毕,关闭素数通道wg.Done() // 协程结束,减少计数器
}// 从素数通道中读取素数并输出
func readIntChan(primeChan <-chan int, wg *sync.WaitGroup) {for i := range primeChan { // 循环读取素数通道中的素数fmt.Println("从通道中读取素数==" + strconv.Itoa(i))}wg.Done() // 协程结束,减少计数器
}
优化思路
创造多个协程处理写入读取通道
相关文章:
使用 Go 语言统计 0-200000 的数字中,哪些是素数?
题目 使用 Go 语言统计 0-200000的数字中,哪些是素数? 思路 两种方法: 单循环遍历 1-200000 数字,并判断是否是素数。 使用了 Goroutine 和通道实现并发: 通过创建两个通道 intChan 和 primeChan,以及一…...
Fabric Measurement
Fabric Measurement 布料测量...
wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载材质文件Mtl 中的纹理图片最简实例(十六)
文章目录 前言一、3d 立方体 model 属性相关文件1. cube.obj2. cube.Mtl3. 纹理图片 cordeBouee4.jpg二、代码实例1. 依赖库和头文件1.1 assimp1.2 stb_image.h2. egl_wayland_obj_cube.cpp3. Matrix.h 和 Matrix.cpp4. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c5.…...
面试常问:为什么 Vite 速度比 Webpack 快?
前言 最近作者在学习 webpack 相关的知识,之前一直对这个问题不是特别了解,甚至讲不出个123....,这个问题在面试中也是常见的,作者在学习的过程当中总结了以下几点,在这里分享给大家看一下,当然最重要的是…...
React腳手架已經創建好了,想使用Vite作為開發依賴
使用Vite作為開發依賴 安裝VITE配置VITE配置文件簡單的VITE配置項更改package.json中的scripts在根目錄中添加index.html現在可以瀏覽你的頁面了 安裝VITE 首先,在現有的React項目中安裝VITE npm install vite --save-dev || yarn add vite --dev配置VITE配置文件 …...
数据结构——双向链表(C语言版)
上一章:数据结构——单向链表(C语言版)-CSDN博客 目录 什么是双向链表? 双向链表的节点结构 双向链表的基本操作 完整的双向链表示例 总结 什么是双向链表? 双向链表是一种常见的数据结构,它由一系列节…...
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
一、缓存雪崩 简单理解:由于原有缓存失效,新缓存未到期间 (例如:设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成…...
深度学习pytorch——多层感知机反向传播(持续更新)
在讲解多层感知机反向传播之前,先来回顾一下多输出感知机的问题,下图是一个多输出感知机模型: 课时44 反向传播算法-1_哔哩哔哩_bilibili 根据上一次的分析深度学习pytorch——感知机(Perceptron)(持续更新…...
五、分布式锁-redission
源码仓库地址:gitgitee.com:chuangchuang-liu/hm-dingping.git 1、redission介绍 目前基于redis的setnx特性实现的自定义分布式锁仍存在的问题: 问题描述重入问题同一个线程无法多次获取统一把锁。当方法A成功获取锁后,调用方法B࿰…...
ARM的三个按键实验
main.c #include "key_inc.h"//封装延时函数void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}}}int main(){//按键中断初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf("in main pro\n");delay(1000);}re…...
高架学习笔记之需求工程
目录 一、什么是软件需求 二、需求工程 2.1. 需求获取 2.2. 需求分析 2.3. 形成需求规格 2.4. 需求确认 2.5. 需求管理 2.5.1. 变更控制 2.5.2. 版本控制 2.5.3. 需求跟踪 2.5.4. 需求状态跟踪 一、什么是软件需求 软件需求目前没有统一的定义,一般是指用…...
mysql基础2多表查询
多表查询 多表关系: 一对多 案例: 部门 与 员工的关系 关系: 一个部门对应多个员工,一个员工对应一个部门 实现: 在多的一方建立外键,指向一的一方的主键 多对多 案例: 学生 与 课程的关系 关系: 一个学生可以选修多门课程,一门课程也可以…...
Qt 写一个邮件发送程序
最近在完成一个邮箱代替的告警功能,写了一个邮件发送的demo 以下为代码: #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QTcpSocket> namespace Ui { class MainWindow; }class MainWindow : public QMainWin…...
swagger3快速使用
目录 🍿1.导入依赖 🌭2.添加配置文件 🧂3.添加注解 🥯4.访问客户端 1.导入依赖 引入swagger3的依赖包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artif…...
一键入门Ubuntu22!
目录 一、安装 二、常用目录 三、常用指令 四、用户指令 五、ssh与scp 六、服务相关 七、Python与Pycharm 八、Vim编辑器 九、Ubuntu22下使用Mysql 十、Ubuntu22下使用mongodb 十一、Ubuntu22下使用redis Ubuntu是一个基于Debian的开源操作系统,由Canoni…...
阿里云服务器价格购买价格表,2024新版报价查询
2024年腾讯云服务器优惠价格表,一张表整理阿里云服务器最新报价,阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单,大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…...
实现防抖函数并支持第一次立刻执行(vue3 + ts环境演示)
1、先看一效果: 2、实现思路: 使用定时器setTimeout和闭包实现常规防抖功能;增加immediate字段控制第一次是否执行一次函数(true or false);增加一个flag标识,在第一次执行时,将标…...
WPF —— DataGrid数据网格
1 :DataGrid简介 DataGrid 是数据网格 : 可以显示网格数据的控件,通过自定义列模版 来去实现各种网格效果 , 可以使用以下几中标签显示不同数据 2 :DataGrid常用的组件 显示文本: DataGridTextColumn 显示复选框: DataGridChec…...
牛客题霸-SQL进阶篇(刷题记录一)
本文基于前段时间学习总结的 MySQL 相关的查询语法,在牛客网找了相应的 MySQL 题目进行练习,以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多,因此本文不再展示,只提供 MySQL 代码与示例输出。 部分题目因…...
网络安全实训Day12
写在前面 注意根据笔记中的缩进判断该文本所在层级。 网络空间安全实训-网络安全技术 SSL VPN SSL协议 定义:一种应用层的安全保护技术 工作流程 1.客户端与服务器通过三次握手建立TCP连接 2.客户端向服务器发送Client-Hello信息,消息中包含希望访问的…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
