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

★判断素数的几种方法(由易到难,由慢到快)

素数的定义:

        素数,又称为质数,指的是“大于1的整数中,只能被1和这个数本身整除的数”。换句话说,素数是只有两个正约数(1和本身)的自然数。素数在数论中有着重要的地位,且素数的个数是无限的。例如,2、3、5、7、11、13等都是素数。判断一个数是否为素数的方法有多种,包括试除法、埃筛法等。

暴力法:

素数判定,是检验一个给定的整数是否为素数的测试。
判断 n 是否为素数时,最简单的方式就是暴力法:遍历的所有大于 1 且小于 n 的整数,判断 n 是否可以被这些数整除,如果不存在可以整除的数,则为素数;否则为合数。

#include <bits/stdc++.h>
using namespace std;//暴力法bool isPrime(int n) {  if (n <= 1) return false;  for (int i = 2; i <= n-1; i++) {  if (n % i == 0) {  return false;  }  }  return true;  
} int main() {  int n;  cout << "Enter a number: ";  cin >> n;  if (isPrime(n))  std::cout << n << " is a prime number." << std::endl;  else  std::cout << n << " is not a prime number." << std::endl;  return 0;  
}

暴力法的优化:

        暴力法效率极低,如果n为一万,则核心代码要跑n-2次,其实我们只需要判断2~√n个数,因为一个数如果可以因数分解(不是质数),那么分解得到的两个数一定是一个小于等于√n,一个大于等于√n,一个合数一定由两个自然数相乘,一个大于等于平方根一个小于等于平方根,并且成对存在,所以只判断前根号个。这时我们需要使用sqrt函数来求根号。
代码如下:

#include <bits/stdc++.h>
using namespace std;//暴力法的优化 
bool isPrime(int n) {  if (n <= 1) return false;  for (int i = 2; i <= sqrt(n); i++) {  if (n % i == 0) {  return false;  }  }  return true;  
} int main() {  int n;  cout << "Enter a number: ";  cin >> n;  if (isPrime(n))  std::cout << n << " is a prime number." << std::endl;  else  std::cout << n << " is not a prime number." << std::endl;  return 0;  
}

埃式筛选:

        埃拉托斯特尼筛法(Sieve of Eratosthenes)是一种简单且古老的用来找出一定范围内所有素数的算法。其基本思想是从2开始,将每个素数的各个倍数,标记为合数(非素数),直到标记到所给定的范围为止。

具体的步骤如下
  1. 创建一个布尔数组 notPrime[0..n+1],并初始化为 true。这个数组用来表示对应索引的数是否为素数(true 表示可能是素数,false 表示不是素数或还未检测)。通常 notPrime[0] 和 notPrime[1] 会被设为 false,因为0和1不是素数。

  2. 从 p = 2 开始,即最小的素数,一直到 sqrt(n)(n为要筛的范围)。

  3. 如果 notPrime[p] 为 true,则 p 是一个素数。

  4. 接下来,标记 p 的所有倍数(从 p*p 开始,一直到 n)为非素数。即设置 notPrime[p*i] 为 false,其中 i 从 p 开始递增。

  5. 重复步骤3和4,直到 p 超出 sqrt(n)

  6. 最后,数组中剩余标记为 true 的索引对应的数就是素数。

#include <bits/stdc++.h>
using namespace std;//埃式筛法
bool sieveOfEratosthenes(int n,vector<bool>& notPrime) {  for (int p = 2; p * p <= n; p++) {  //将素数的倍数全部标记为false if (notPrime[p] == true) {  for (int i = p * p; i <= n; i += p)  notPrime[i] = false;  }  }  return notPrime[n];
}  
int main() {  int n;  cout << "Enter a number: ";  cin >> n; vector<bool> notPrime(n + 1, true);notPrime[0] = notPrime[1] = false;  if(sieveOfEratosthenes(n,notPrime)) cout << n << " is a prime number." << std::endl;  else  cout << n << " is not a prime number." << std::endl;return 0;  
}

欧拉筛选:

具体的步骤如下        

        埃式筛选任然有一些可以改进的地方,比如说当筛选到2时,会将4,、6、8、10、12等2的倍数标记为false。然而当筛选到3时,会将6、9、12、15等3的倍数标记为fasle,这其中6和12等既是2的倍数又是3的倍数的一些数,会被重复标记。

        欧拉筛选素数法是一种更加高效的素数筛选算法,它的基本思想是从2开始,将每个素数的倍数都标记成合数,但与传统的埃拉托斯特尼筛法(Sieve of Eratosthenes)不同,欧拉筛选保证了每个合数只被其最小质因子筛选一次,从而实现了线性的时间复杂度。

下面是欧拉筛选素数法的详细实现步骤:

  1. 初始化:创建一个布尔数组 isPrime[0..n],并全部初始化为 true。这个数组用于表示从0到n的每个数是否为素数。通常,我们会忽略0和1,因为它们不是素数。

  2. 筛选过程

    • 从 p = 2 开始,这是第一个素数。
    • 对于每个 p,遍历所有 i(从 p 的平方开始,直到 n),并将 isPrime[i*p] 设置为 false,因为 i*p 显然不是素数(除非 i 是1,但这在循环开始条件中已经被排除了)。
    • 在遍历 i 的过程中,如果发现 isPrime[i] 已经为 false,则跳出内层循环。这是因为如果 i 不是素数,那么 i*p 已经被一个比 p 更小的素数标记过了,无需再次标记。
    • 继续增加 p,直到所有小于等于 n 的数都被检查。
  3. 收集素数:最后,遍历 isPrime 数组,所有标记为 true 的位置对应的数就是素数。

        这个算法的关键在于,它确保了每个合数只被其最小的质因子筛选一次。这是通过在内层循环中检查 isPrime[i] 并在发现其为 false 时跳出循环来实现的。这样,每个合数只会在其最小质因子第一次出现时被标记,从而避免了重复标记,提高了效率。

        欧拉筛选素数法的时间复杂度是线性的,即 O(n),这使得它在处理大规模数据时比传统的埃拉托斯特尼筛法更加高效。

        需要注意的是,虽然欧拉筛选素数法在某些情况下比埃拉托斯特尼筛法更优,但它并不是在所有情况下都是最佳选择。具体使用哪种算法取决于问题的具体要求和数据的规模。

#include <bits/stdc++.h>
using namespace std;
vector<int> primes; 
void linearSieve(int n) {  vector<bool> isPrime(n + 1, true);  for (int i = 2; i <= n; ++i) {  if (isPrime[i]) {  primes.push_back(i);  }  for (size_t j = 0; j < primes.size() && i * primes[j] <= n; ++j) {  isPrime[i * primes[j]] = false;  if (i % primes[j] == 0) {  break;  }  }  }  }  int main() {  int n = 100; // 可以根据需要修改这个值  cout << "Prime numbers up to " << n << " are: ";  linearSieve(n);  for (int prime : primes) {  cout << prime << " ";  }  return 0;  
}

对于小范围的素数判断,试除法通常足够高效;对于需要生成大量素数的情况,埃筛法更为合适;

相关文章:

★判断素数的几种方法(由易到难,由慢到快)

素数的定义&#xff1a; 素数&#xff0c;又称为质数&#xff0c;指的是“大于1的整数中&#xff0c;只能被1和这个数本身整除的数”。换句话说&#xff0c;素数是只有两个正约数&#xff08;1和本身&#xff09;的自然数。素数在数论中有着重要的地位&#xff0c;且素数的个数…...

vue svelte solid 虚拟滚动性能对比

前言 由于svelte solid 两大无虚拟DOM框架&#xff0c;由于其性能好&#xff0c;在前端越来越有影响力。 因此本次想要验证&#xff0c;这三个框架关于实现表格虚拟滚动的性能。 比较版本 vue3.4.21svelte4.2.12solid-js1.8.15 比较代码 这里使用了我的 stk-table-vue(np…...

IDEA中新增文件,弹出框提示是否添加到Git点错了,怎么重新设置?

打开一个配置了Git的项目&#xff0c;新增一个文件&#xff0c;会弹出下面这个框。提示是否将新增的文件交给Git管理。 一般来说&#xff0c;会选择ADD&#xff0c;并勾选Dont ask agin&#xff0c;添加并不再询问。如果不小心点错了&#xff0c;可在IDEA中重新设置&#xff08…...

LV15 day5 字符设备驱动读写操作实现

一、读操作实现 ssize_t xxx_read(struct file *filp, char __user *pbuf, size_t count, loff_t *ppos); 完成功能&#xff1a;读取设备产生的数据 参数&#xff1a; filp&#xff1a;指向open产生的struct file类型的对象&#xff0c;表示本次read对应的那次open pbuf&#…...

Uninty 鼠标点击(摄像机发出射线-检测位置)

平面来触发碰撞&#xff0c;胶囊用红色材质方便观察。 脚本挂载到胶囊上方便操作。 目前实现的功能&#xff0c;鼠标左键点击&#xff0c;胶囊就移动到那个位置上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c6 : MonoBe…...

描述下Vue自定义指令

描述下Vue自定义指令 &#xff08;1&#xff09;自定义指令基本内容&#xff08;2&#xff09;使用场景&#xff08;3&#xff09;使用案例 在 Vue2.0 中&#xff0c;代码复用和抽象的主要形式是组件。然而&#xff0c;有的情况下&#xff0c;你仍然需要对普通 DOM 元素进行底层…...

2024.3.7

作业&#xff1a; 1、OSI的七层网络模型有哪些&#xff0c;每一层有什么作用&#xff1f; &#xff08;1&#xff09;应用层 负责处理不同应用程序之间的通信&#xff0c;需要满足提供的协议&#xff0c;确保数据发送方和接收方的正确 &#xff08;2&#xff09;表示层…...

this.$watch 侦听器 和 停止侦听器

使用组件实例的$watch()方法来命令式地创建一个侦听器&#xff1b; 它还允许你提前停止该侦听器 语法&#xff1a;this.$watch(data, method, object) 1. data&#xff1a;侦听的数据源&#xff0c;类型为String 2. method&#xff1a;回调函数&#x…...

P1030 [NOIP2001 普及组] 求先序排列题解

题目 给出一棵二叉树的中序与后序排列。求出它的先序排列。&#xff08;约定树结点用不同的大写字母表示&#xff0c;且二叉树的节点个数≤8&#xff09;。 输入输出格式 输入格式 共两行&#xff0c;均为大写字母组成的字符串&#xff0c;表示一棵二叉树的中序与后序排列。…...

【分布式】NCCL Split Tree kernel内实现情况 - 06

相关系列 【分布式】NCCL部署与测试 - 01 【分布式】入门级NCCL多机并行实践 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式训练入门与实践 - 04 目录 相关系列概述1.1 Tree1.2 double binary tree初始化和拓扑2.1 Tree的初始化与差异2.2 ncclGetBtreeKernel内部…...

C语言深入学习 --- 4.自定义类型(结构体+枚举+联合)

第四章 自定义类型&#xff1a;结构体&#xff0c;枚举&#xff0c;联合 结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 结构体的内存对齐 结构体实现位段&#xff08;位段的填充 和 可移植性&#xff09; 枚举 枚举类型的定义 枚举的优点 枚举的使…...

AI自然语言中默认上下文长度4K 几K是什么意思?

环境&#xff1a; 4K 问题描述&#xff1a; AI自然语言中默认上下文长度4K 几K是什么意思&#xff1f; 解决方案&#xff1a; 在自然语言处理中&#xff0c;“k” 表示 “千”&#xff0c;是一种简写方式。当我们说 “4k” 时&#xff0c;实际上指的是 “4,000”。在上下文…...

vSphere 8考试认证题库 2024最新(VCP 8.0版本)

VMware VCP-DCV&#xff08;2V0-21.23&#xff09;认证考试题库&#xff0c;已全部更新&#xff0c;答案已经完成校对&#xff0c;完整题库请扫描上方二维码访问。正常考可以考到450分以上&#xff08;满分500分&#xff0c;300分通过&#xff09; An administrator is tasked …...

系统学习Python——装饰器:“私有“和“公有“属性案例-[装饰器参数、状态保持和外层作用域]

分类目录&#xff1a;《系统学习Python》总目录 文章《系统学习Python——装饰器&#xff1a;“私有“和“公有“属性案例-[实现私有属性]》中使用的类装饰器接受任意多个参数来命名私有属性。然而真正发生的情况是&#xff0c;参数传递给了Private函数&#xff0c;然后Private…...

星辰天合参与编制 国内首个可兼顾 AI 大模型训练的高性能计算存储标准正式发布

近日&#xff0c;在中国电子工业标准化技术协会高标委的支持和指导下&#xff0c;XSKY星辰天合作为核心成员参与编制的《高性能计算分布式存储系统技术要求》团体标准&#xff0c;在中国电子工业标准化技术协会网站正式发布。 该团体标准强调了分布式存储系统对包括传统高性能计…...

算法训练day38动态规划基础Leetcode509斐波纳切数70爬楼梯746使用最小花费爬楼梯

什么是动态规划 对于动态规划问题&#xff0c;我将拆解为如下五步曲&#xff0c;这五步都搞清楚了&#xff0c;才能说把动态规划真的掌握了&#xff01; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组&a…...

Leetcode 206. 反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#xff1a; 输…...

电子科技大学课程《计算机网络系统》(持续更新)

前言 本校的课程课时有所缩减&#xff0c;因此可能出现与你学习的课程有所减少的情况&#xff0c;因此对其他学校的同学更多的作为参考作用。本文章适合学生的期中期末考试&#xff0c;以及想要考研电子科技大学的同学&#xff0c;电子科技大学同学请先看附言。 第一章 计算…...

HBase介绍、特点、应用场景、生态圈

目录: 一、HBase简介 二、NoSQL和关系型数据库对比 三、HBase特点 四、应用场景 五、HBase生态圈技术 一、HBase简介 HBase是一个领先的NoSQL数据库 是一个面向列存储的NoSQL数据库 是一个分布式Hash Map&#xff0c;底层数据是Key-Value格式 基于Coogle Big Table论文 使用HD…...

蓝桥杯错误记录

今天在做 小蜜蜂的综合案例的时候&#xff0c;数码管显示&#xff0c;有重影。 #include <STC15F2K60S2.H> unsigned char num; unsigned char code Duan[22]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80, 0xc6,0xc0,0x86,0x8e,0xbf,0x7f,0XC1,0X8C,0…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...