当前位置: 首页 > news >正文

埃氏算法C++实现: 快速输出质数( 素数 )

目录

1.简介

算法原理

算法特点

应用场景

2.一般求素数方法

3.埃氏算法求素数

3.1.无动态分配

3.2.有动态分配


1.简介

埃氏算法(Eratosthenes Sieve)‌,全称为埃拉托斯特尼筛法,是一种由古希腊数学家埃拉托斯特尼在公元前3世纪提出的古老而经典的算法,用于计算一定范围内的素数。其基本思想是通过从小到大遍历每个数字,并将其所有倍数标记为非质数,从而逐步排除所有非质数,最终得到所有的素数。‌

算法原理

埃氏筛法的基本原理是:要得到自然数n以内的全部素数,必须把不大于√n的所有素数的倍数剔除,剩下的就是素数。具体步骤如下:

  1. 初始化:创建一个布尔类型的数组(或列表),用于表示范围内的所有数字,初始时将所有元素标记为“true”,表示都是素数(或待检定的数)。
  2. 遍历与筛选:从2开始遍历数组中的每个数。如果当前数字被标记为素数(即为“true”),则进行下一步筛选操作;否则,跳过该数字。对于当前素数p,从p的平方开始,将p的倍数(如2p、3p、4p等)标记为非质数(即为“false”),因为p的所有小于p平方的倍数在之前的步骤中已经被更小的素数筛选过了。
  3. 重复操作:继续向后遍历,重复步骤2的筛选过程,直到遍历完整个范围。
  4. 输出结果:遍历结束后,所有未被标记为非质数(仍为“true”)的数字都是素数,将其输出即可。

算法特点

  1. 简单直观‌:埃氏筛法的原理简单易懂,实现起来也较为直接。
  2. 高效性‌:虽然算法的时间复杂度为O(nloglogn),但在实际应用中,它仍然是寻找一定范围内素数的高效方法之一。
  3. 历史悠久‌:作为一种古老的算法,埃氏筛法在数学史上占有重要地位,是素数研究的基础工具之一。

应用场景

埃氏筛法广泛应用于数论、密码学、计算机科学等领域,特别是在需要快速生成大量素数时,其高效性得到了充分体现。例如,在密码学中的RSA算法中,就需要生成大量的素数作为密钥的基础。

2.一般求素数方法

#include <iostream>
#include <cmath>using namespace std;bool is_prime(int num) {if (num <= 1) return false;if (num == 2) return true; // 2 is the only even prime numberif (num % 2 == 0) return false; // other even numbers are not primesint sqrt_num = static_cast<int>(sqrt(num));for (int i = 3; i <= sqrt_num; i += 2) {if (num % i == 0) return false;}return true;
}void find_primes_up_to(int n, int* primes, int& prime_count) {prime_count = 0;for (int i = 2; i <= n; ++i) {if (is_prime(i)) {primes[prime_count++] = i;}}
}int main() {int n;cout << "Enter a number: ";cin >> n;// Assuming the maximum number of primes is n/2 (an overestimate)int* primes = new int[n / 2];int prime_count;find_primes_up_to(n, primes, prime_count);cout << "Prime numbers up to " << n << " are: ";for (int i = 0; i < prime_count; ++i) {cout << primes[i] << " ";}cout << endl;delete[] primes; // Free the allocated memoryreturn 0;
}

3.埃氏算法求素数

3.1.无动态分配

#include <iostream>
#include <cmath>using namespace std;bool is_prime(int num) {if (num <= 1) return false;if (num == 2) return true; // 2 is the only even prime numberif (num % 2 == 0) return false; // other even numbers are not primesint sqrt_num = static_cast<int>(sqrt(num));for (int i = 3; i <= sqrt_num; i += 2) {if (num % i == 0) return false;}return true;
}void find_primes_up_to(int n, int primes[], int& prime_count) {prime_count = 0;for (int i = 2; i <= n; ++i) {if (is_prime(i)) {primes[prime_count++] = i;}}
}int main() {int n;cout << "Enter a number: ";cin >> n;// Assuming the maximum number of primes is n/2 (an overestimate)int primes[n / 2];int prime_count;find_primes_up_to(n, primes, prime_count);cout << "Prime numbers up to " << n << " are: ";for (int i = 0; i < prime_count; ++i) {cout << primes[i] << " ";}cout << endl;return 0;
}

3.2.有动态分配

#include <iostream>
#include <cmath>using namespace std;bool is_prime(int num) {if (num <= 1) return false;if (num == 2) return true; // 2 is the only even prime numberif (num % 2 == 0) return false; // other even numbers are not primesint sqrt_num = static_cast<int>(sqrt(num));for (int i = 3; i <= sqrt_num; i += 2) {if (num % i == 0) return false;}return true;
}void find_primes_up_to(int n, int* primes, int& prime_count) {prime_count = 0;for (int i = 2; i <= n; ++i) {if (is_prime(i)) {primes[prime_count++] = i;}}
}int main() {int n;cout << "Enter a number: ";cin >> n;// Assuming the maximum number of primes is n/2 (an overestimate)int* primes = new int[n / 2];int prime_count;find_primes_up_to(n, primes, prime_count);cout << "Prime numbers up to " << n << " are: ";for (int i = 0; i < prime_count; ++i) {cout << primes[i] << " ";}cout << endl;delete[] primes; // Free the allocated memoryreturn 0;
}

相关文章:

埃氏算法C++实现: 快速输出质数( 素数 )

目录 1.简介 算法原理 算法特点 应用场景 2.一般求素数方法 3.埃氏算法求素数 3.1.无动态分配 3.2.有动态分配 1.简介 ‌埃氏算法&#xff08;Eratosthenes Sieve&#xff09;‌&#xff0c;全称为埃拉托斯特尼筛法&#xff0c;是一种由古希腊数学家埃拉托斯特尼在公元…...

后端的config包中的常用配置

文章目录 一. CorsConfig二. Knife4jConfig三. MyBatisPlusConfig四. RedisTemplateConfig五. RedissonConfig 一. CorsConfig 全局跨域配置 Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registr…...

基于亿坊PHP框架构建物联网解决方案的优势分析!

在物联网 (IoT) 领域&#xff0c;选到合适的框架对于整个项目的开展也尤为重要。通常情况下&#xff0c;基于PHP的一些主流框架被用户常选择&#xff0c;今天就带大家了解下基于亿坊PHP框架构建物联网解决方案的优势有哪些&#xff1f; 1、开发效率高 在物联网项目中&#xf…...

IoTDB结合Mybatis使用示例(增删查改自定义sql等)

IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库&#xff0c;针对IoTDB的内容不做过多介绍&#xff0c;在使用该时序库时&#xff0c;往往有一定入门门槛&#xff0c;不同于关系型数据库或文档型数据库那般方便维护和接入开发&#xff0c;…...

skynet 源码阅读 -- 启动主流程

Skynet 启动主流程分析 Skynet 是一个轻量级、高并发的服务器框架。它在启动时会进行一系列初始化操作&#xff0c;并启动多个不同功能的线程&#xff08;Monitor、Timer、Worker、Socket&#xff09;&#xff0c;从而实现消息分发、定时器、网络I/O等核心功能。本文主要从 ma…...

OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯

目录 简述 什么是高通滤波&#xff1f; 高通滤波的概念 应用场景 索贝尔算子 算子公式 实现代码 特点 沙尔算子 算子公式 实现代码 特点 拉普拉斯算子 算子公式 实现代码 特点 高通滤波器的对比与应用场景 相关阅读 OpenCV&#xff1a;图像滤波、卷积与卷积核…...

UDP 广播组播点播的区别及联系

1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址&#xff0c;又叫多播地址&#xff0c;他的前四位必须是1110&#xff0c;所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…...

STM32补充——IAP

0 前置知识&#xff1a; FLASH相关内容&#xff1a;前往STM32补充——FLASH STM32三种烧录方式&#xff08;看看就行&#xff09;&#xff1a; 1.ISP&#xff1a;In System Programming&#xff08;在系统编程&#xff09; 执行芯片厂商的 Bootloader 程序进入 ISP 模式&…...

Jetson Xavier NX (ARM) 使用 PyTorch 安装 Open3D-ML 指南

由于 Jetson 为 ARM64 (aarch64) 的系统架构&#xff0c;所以不能用 pip install 直接安装&#xff0c;需要通过源码编译。 升级系统 JetPack 由于 Open3D-ML 目前只支持 CUDA 10.0 以及 CUDA 11.*&#xff0c;并且 JetPack 的 CUDA 开发环境只有10.2、11.4以及12.2&#xff0…...

【C++高并发服务器WebServer】-1:Linux中父子进程fork创建及关系、GDB多进程调试

本文目录 一、进程创建二、GDB多进程调试 一、进程创建 在Linux中输入man 2 fork可以查看man文档中的fork的相关函数信息。 fork的作用就是创建一个子进程。 通过fork我们可以知道&#xff0c;创建子进程的时候&#xff0c;复制父进程的信息。 我们看看翻译的man文档信息&am…...

C语言数组详解:从基础到进阶的全面解析

在C语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中&#xff0c;数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中&#xff0c…...

docker的前世今生

docker来自哪里&#xff1f; 从我们运维部署的历史来看&#xff0c;宿主机从最初的物理机到虚拟机&#xff0c;再到docker&#xff0c;一步步演进到现在。技术演进其实是为了解决当前技术的痛点&#xff0c;那我们来看看有哪些痛点以及如何克服痛点的。 物理机 一般来说&…...

python实现施瓦茨-克里斯托费尔【全网首个】根据用户输入推测函数

上代码&#xff1a; from sympy import symbols, integrate, simplify from sympy.plotting import plotn int(input("n:")) if n < 2:print("Error: Must n > 2") i 0 a [] aef [] A [] x, y symbols(x y) z, w symbols(z w)while i < n…...

c语言中的数组(上)

数组的概念 数组是⼀组相同类型元素的集合&#xff1b; 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。 数组中存放的多个数据&#xff0c;类型是相同的。 数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般⽐较多⻅的是⼆维数组。 数组创建 在C语言…...

Unity3D仿星露谷物语开发25之创建时钟界面

1、目标 在时钟界面显示当前时钟信息&#xff0c;同时设置特殊按钮可以快速推进时间用于测试。 2、创建GameClock.cs脚本 在Assets -> Scripts -> TimeSystem目录下创建GameClock.cs脚本。 代码如下&#xff1a; using System.Collections; using System.Collections…...

数据结构测试题1

一、选择题: 1&#xff0e;若长度为n的钱性表采用顺序存储结构&#xff0c;删除它的第i数据元素之前&#xff0c;需要先依次向前移动( )个数据元素。( C ) A .n-i B.ni C.n-i-1 D.n-i1 2.在单链表中&#xff0c;已知q指的结点是p指的结点的直接前驱结点&am…...

android wifi AsyncChannel(WifiManager和WifiP2pManager)

AynscChannel的讲解 [Android]AsyncChannel介绍-CSDN博客 WifiP2pManager里的channel的使用理解 WifiP2pManager.java public void createGroup(Channel c, ActionListener listener) {checkChannel(c);c.mAsyncChannel.sendMessage(CREATE_GROUP, WifiP2pGroup.NETWORK_ID_PE…...

【Image Captioning】DynRefer

DynRefer是由中国科学院大学于2024年提出的用于1种用于区域级多模态任务的模型。DynRefer 通过模拟人类视觉认知过程&#xff0c;显著提升了区域级多模态识别能力。通过引入人眼的动态分辨率机制&#xff0c; 能够以同时完成区域识别、区域属性检测和区域字幕生成任务。 文章链…...

Midjourney基础-常用修饰词+权重的用法大全

用好修饰词很关键 Midjourney要用除了掌握好提示词的写法&#xff0c;按照上一篇《做Midjourney最好图文教程-提示词公式以及高级参数讲解》画面主体 场景氛围 主体行为 构图方式 艺术风格 图像质量。 要画出有质感的内容我们必须要掌握好“修饰词”&#xff0c;这些修饰…...

没有屋檐的房子-023粪堆旁边的舞蹈

爱美是天性&#xff0c;贫苦的农村人也一样&#xff0c;贫苦的时代也一样。 本世纪&#xff0c;广场舞在华夏大地遍地开花&#xff0c;甚至都传到了外面。但是广场舞这种舞蹈形式并不是互联网时代的特产&#xff0c;也不是电声设备日益高级和普及时代的特产&#xff0c;更不是大…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...