【C++】B2085 第 n 小的质数

news2025/1/4 1:05:29

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述
    • 题目内容
      • 输入格式
      • 输出格式
      • 题目示例
  • 💯原始做法分析
    • 解法源码解析
      • 1. 步骤分析
      • 2. 问题分析
      • 3. 性能问题
  • 💯老师提供的优化解法
    • 优化代码
    • 每部分解释
      • 1. 最大检查范围优化
      • 2. 基于因子对积的矩限情况
      • 3. 质数计数器和条件判断
  • 💯扩展与进一步优化
    • 使用埃拉托色尼筛法
    • 实现代码
    • 性能分析
  • 💯小结


在这里插入图片描述


💯前言

  • 在计算机竞赛和线上评测中,第一次接触到一些关于质数的题目,经常会遇到质数判断和数学选择解法不充分优化并且越过时间限制的情况。本文将从一道关于质数的题目出发,细致分析题目的解法,对比我们的原始做法和老师提供的优化解法进行对比,并提出不同方向的扩展思考。通过这些分析,希望帮助读者更好地理解质数判断的实现,也能优化他们的解题能力。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

B2085 第 n 小的质数
在这里插入图片描述

这道题目来自洛谷平台,名为“B2085 第 n 小的质数”,请系统在此总结全问题。

题目内容

输入一个正整数 n n n,求正整数范围中第 n n n 小的质数。

输入格式

一个不超过 30000 的正整数 n n n

输出格式

n n n 小的质数。

题目示例

输入

10

输出

29

💯原始做法分析

在初始解法中,我使用了一种直观但效率不高的做法:通过逐个检查每个数字是否是质数,计数第 n n n 个质数就结束。以下是原始代码:

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int count = 0;
    int i = 2;
    while (1)
    {
        int flag = 1;
        for (int j = 2; j < i; j++)
        {
            if (i % j == 0)
            {
                flag = 0;
                break;
            }
        }

        if (flag)
            count++;

        if (count == n)
        {
            cout << i << endl;
            break;
        }

        i++;
    }

    return 0;
}

在这里插入图片描述

解法源码解析

1. 步骤分析

  1. 通过定义变量 n 输入需求的第 n n n 个质数。
  2. i=2 为起始,逐步检查每个数字是否为质数:
    • 通过完全逐环,从 2 2 2 i − 1 i-1 i1 检查是否存在因数。
    • 如果能被数 j j j 整除,则表明不是质数;否则计为质数。
  3. 如果质数计数达到 n n n,则输出当前质数,结束程序。

2. 问题分析

原始代码实现了基础功能,但是在最大输入范围内,每次检查质数都需要在 O ( i ) O(i) O(i) 处理时间。总处理时间为系列和:
O ( 2 ) + O ( 3 ) + O ( 4 ) + ⋯ + O ( k ) = O ( k 2 ) O(2) + O(3) + O(4) + \dots + O(k) = O(k^2) O(2)+O(3)+O(4)++O(k)=O(k2)
对于输入范围较大的情况,这样的处理方式显然超出了时间限制(TLE)。

3. 性能问题

  1. 质数判断需要对每个 i i i 重复检查,没有用到历史质数信息。
  2. 检查的范围是 2 2 2 i − 1 i-1 i1,而实际上只需要检查到 i \sqrt{i} i ,是其中一个重要的优化场景。
  3. 处理质数的繁并级数增长,在输入范围较大时,会导致超时错误。

💯老师提供的优化解法

老师提出了基于 因数对积 的优化思路:如果 n n n 有一个因子 a a a,则存在一个不大于 n \sqrt{n} n 的因子 b b b。使用该思路,可以在判断质数时,尽可能减少检查范围,并尽可能推动应用性能。

优化代码

老师提供的优化代码如下:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int n = 0; // 输入的目标:第 n 个质数
    cin >> n;
    int i = 2; // 从 2 开始检测质数
    int c = 0; // 质数计数器

    while (1) // 无限循环,直到找到第 n 个质数
    {
        int flag = 1; // 假设当前数 i 是质数
        int j = 0;    // 因子检测变量
        for (j = 2; j <= sqrt(i); j++) // 从 2 遍历到 sqrt(i)
        {
            if (i % j == 0) // 如果 i 能被 j 整除
            {
                flag = 0; // 标记为非质数
                break;    // 退出循环
            }
        }
        if (flag) // 如果 flag 仍为 1,说明 i 是质数
            c++; // 质数计数器加 1
        if (c == n) // 如果已经找到第 n 个质数
        {
            cout << i << endl; // 输出当前数 i
            break; // 结束程序
        }
        i++; // 检测下一个数
    }
    return 0;
}

在这里插入图片描述

每部分解释

1. 最大检查范围优化

优化前:需要从 j = 2 j=2 j=2 检查到 j < i j < i j<i,最均检查次数为 i − 2 i-2 i2
优化后:只需要检查 j j j 范围为 [ 2 , i ] [2, \sqrt{i}] [2,i ],尽可能减少计算次数。

2. 基于因子对积的矩限情况

根据计算规则,如果存在一个因子 a a a,但 a > i a > \sqrt{i} a>i ,则依照因子对积规则,必然存在一个 b ≤ i b \leq \sqrt{i} bi 。因而,只需检查尺寸最大为 i \sqrt{i} i

3. 质数计数器和条件判断

通过 flag 表示当前数是否为质数,如果检查到任何因数,则将标记编为非质数,并退出检查循环。如果第 n n n 个质数计数器达成,则输出质数,退出程序。


💯扩展与进一步优化

使用埃拉托色尼筛法

如果需要更高效地找到第 n n n 个质数,可以考虑使用埃拉托色尼筛法。这是一种基于标记非质数的算法,能够快速筛选出某范围内的所有质数。

实现代码

以下是埃拉托色尼筛法的实现:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n;
    cin >> n;

    const int MAX = 200000; // 预估范围
    vector<bool> is_prime(MAX, true);
    is_prime[0] = is_prime[1] = false;

    for (int i = 2; i * i < MAX; ++i)
    {
        if (is_prime[i])
        {
            for (int j = i * i; j < MAX; j += i)
                is_prime[j] = false;
        }
    }

    vector<int> primes;
    for (int i = 2; i < MAX; ++i)
    {
        if (is_prime[i])
            primes.push_back(i);
    }

    cout << primes[n - 1] << endl;
    return 0;
}

性能分析

  • 时间复杂度:筛法的时间复杂度为 O ( n log ⁡ log ⁡ n ) O(n \log \log n) O(nloglogn),远优于逐个检查质数的方法。
  • 空间复杂度:需要 O ( n ) O(n) O(n) 的空间存储布尔数组。

💯小结

通过对题目、原始做法以及优化方案的逐步分析,我们可以看出质数问题的优化空间非常大。从逐个检查到基于 n \sqrt{n} n 的优化,再到埃拉托色尼筛法,每一步优化都能显著提升性能。对于大规模输入,使用筛法是更优的选择。而这些方法背后的数学逻辑(如因子对积的关系、筛法的基本原理)更是值得深入理解和学习的。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js详细安装教程

1.下载 [名称]&#xff1a;Node.js [大小]&#xff1a;26.4 MB [语言]&#xff1a;简体中文 [安装环境]&#xff1a;Win7/Win8/Win10 [Node.js15.11.0下载链接]&#xff1a; 通过网盘分享的文件&#xff1a;Node.js 链接: https://pan.baidu.com/s/12WlNlWlX-1ppdhz…

IDEA 搭建 SpringBoot 项目之配置 Maven

目录 1?配置 Maven 1.1?打开 settings.xml 文件1.2?配置本地仓库路径1.3?配置中央仓库路径1.4?配置 JDK 版本1.5?重新下载项目依赖 2?配置 idea 2.1?在启动页打开设置2.2?配置 Java Compiler2.3?配置 File Encodings2.4?配置 Maven2.5?配置 Auto Import2.6?配置 C…

SpringCloud 系列教程:微服务的未来(三)IService接口的业务实现

本文将介绍 IService 接口的基本业务操作、复杂业务操作、Lambda 方法的使用以及批量增加操作&#xff0c;帮助开发者深入了解如何高效地利用 MyBatis-Plus 提供的功能进行数据库操作。无论是简单的单表查询&#xff0c;还是复杂的多表联动&#xff0c;甚至是大数据量的批量操作…

MAC环境安装(卸载)软件

MAC环境安装&#xff08;卸载&#xff09;软件 jdknode安装node&#xff0c;并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净&#xff0c;可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…

VScode SSH 错误:Got bad result from install script 解決

之前vscode好好的&#xff0c;某天突然连接报错如下 尝试1. 服务器没有断开,ssh可以正常连接 2. 用管理员权限运行vscode&#xff0c;无效 3. 删除服务器上的~/.vscode-server 文件夹&#xff0c;无效 试过很多后&#xff0c;原来很可能是前一天anaconda卸载导致注册表项 步…

MATLAB中与矩阵运算相关的函数简介

d e t ( a ) det(a) det(a)表示求方阵的秩 t r a c e ( a ) trace(a) trace(a)表示求方阵对角线之和 i n v ( a ) inv(a) inv(a)表示求方阵的逆矩阵 t r i u ( a ) triu(a) triu(a)表示求矩阵的上三角部分&#xff0c;其余变成0 t r i l ( a ) tril(a) tril(a)表示求矩阵的…

20241227通过配置nomodeset参数解决更新grub之后,ubuntu20.04.5无法启动的问题

20241227通过配置nomodeset参数解决更新grub之后&#xff0c;ubuntu20.04.5无法启动的问题 2024/12/27 17:34 0.397475]pci0000:00:07.0:DPC:RPPI0 l0gsize 0 is invalid dev/nvmeon1p9:clean,251849/4276224 files,3266309/17089792 blocks 缘起&#xff1a;公司电脑要安装加密…

46. Three.js案例-创建颜色不断变化的立方体模型

46. Three.js案例-创建颜色不断变化的立方体模型 实现效果 知识点 Three.js基础组件 WebGLRenderer THREE.WebGLRenderer是Three.js提供的用于渲染场景的WebGL渲染器。它支持抗锯齿处理&#xff0c;可以设置渲染器的大小和背景颜色。 构造器 antialias: 是否开启抗锯齿&am…

ES elasticsearch-8.17.0-windows-x86_64使用

1、下载ES(elasticsearch 简称 ES 下载链接&#xff1a;https://www.elastic.co/downloads/elasticsearch) ES 下载链接&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.0-windows-x86_64.zip))&#xff0c;需要在修改ES配置&#xff0…

4G报警器WT2003H-16S低功耗语音芯片方案开发-实时音频上传

一、引言 在当今社会&#xff0c;安全问题始终是人们关注的重中之重。无论是家庭、企业还是公共场所&#xff0c;都需要一套可靠的安全防护系统来保障人员和财产的安全。随着科技的飞速发展&#xff0c;4G 报警器应运而生&#xff0c;为安全防范领域带来了全新的解决方案。…

uniapp Stripe 支付

引入 Stripe npm install stripe/stripe-js import { loadStripe } from stripe/stripe-js; Stripe 提供两种不同类型组件 Payment Element 和 Card Element&#xff1a;如果你使用的是 Payment Element&#xff0c;它是一个更高级别的组件&#xff0c;能够自动处理多种支…

java Redisson 实现限流每秒/分钟/小时限制N个

1.引入maven包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>red…

2D图像测量到3D点云之物体三维尺寸测量!!!!

0&#xff0c;引言 本文将从双目采集的2D图像到3D点云进行转化&#xff0c;并进行物体尺寸测量&#xff0c;旨在为读者展示2D图像如何关联3D点云&#xff0c;并进行相关工业应用。 将2D图像转化为3D点云&#xff0c;并进行物体尺寸测量的技术&#xff0c;在工业领域有着广泛的…

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下&#xff0c;跨境电商行业正以前所未有的态势重塑国际贸易格局&#xff0c;成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》&#xff0c;…

【亚马逊云】基于Amazon EC2实例部署 NextCloud 云网盘并使用 Docker-compose 搭建 ONLYOFFICE 企业在线办公应用软件

文章目录 1. 部署EC2实例2. 安装 Docker 服务3. 安装docker-compose4. 创建Docker-compose文件5. 创建nginx.conf文件6. 运行docker-compose命令开始部署7. 访问ONLYOFFICE插件8. 访问NextCloud云盘9. 下载并启用ONLYOFFICE插件10. 上传文件测试11. 所遇问题12. 参考链接 1. 部…

Flutter:打包apk,详细图文介绍

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

k8s部署nginx+sshd实现文件上传下载

要通过 nginx 和 sshd 实现文件的上传和下载&#xff0c;通常的做法是结合 SSH 协议和 HTTP 协议&#xff0c;使用 nginx 提供 Web 服务器功能&#xff0c;同时使用 sshd&#xff08;即 SSH 服务&#xff09;来处理通过 SSH 协议进行的文件传输。 SSH 实现文件的上传和下载&…

Java开发生态2024年度总结报告

1 关键要点 尽管数据显示 Java 17 是最常用 JDK&#xff0c;但其用户占比并未超过半数。根据 New Relic 2024 Java 生态系统状态报告&#xff0c;Java 17、11 和 8 的用户比例分别为 35%、33% 和 29%。New Relic 数据中所谓“快速采用”指 Java 21 的采用率仅为 1.4%。虽相较 J…

电路仿真软件PSIM简介

在从事开关电源相关产品开发的工程师或者正在学习开关电源的学习者&#xff0c;常常会用到各种仿真软件进行电路的仿真&#xff0c;不仅可以快速验证电路参数&#xff0c;还能清楚知道各器件的工作状态。 现在的电路仿真软件很多&#xff0c;例如matlab、Multisim、Simplis&…

文档大师:打造一站式 Word 报告解决方案1

前言 在政府、医院、银行、财务以及销售等领域&#xff0c;常常需要创建各种报告文件来展开工作汇报&#xff0c;譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工具支持之前&#xff0c;这类报告主要通过 Word 制作&#xff0c;费时费力且难以维护&#…