【C++】B2084 质因数分解

news2025/1/4 0:22:21

在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯 题目描述:质因数分解
    • 输入格式
    • 输出格式
      • 输入输出样例:
  • 💯 问题解析
    • 1. 质数的定义
    • 2. 题目特点
    • 3. 约束范围
    • 4. 问题分解
  • 💯 解题过程
    • 我的初始代码与错误
      • 代码尝试 1:错误的暴力解法
      • 问题分析:
      • 错误修正:使用单层循环优化
      • 问题分析:
    • 老师的做法与分析
      • 老师的代码:
      • 分析:
    • 改进与优化
      • 改进点 1:限制循环范围
      • 改进点 2:质数判断
      • 最终代码:
    • 完整解析
      • 思路总结:
      • 复杂度分析:
  • 💯小结


在这里插入图片描述


💯前言

  • 本次分析的题目是关于质因数分解的。题目要求我们通过数学和编程技巧,在已知整数 n n n 的前提下找到两个质因数中较大的那个。经过分析与尝试,我们对本题进行了深入剖析,不仅学习了老师的实现方法,还对自己的方法进行了调整和优化,最终得出了准确的解法。
    以下内容详细记录了题目的解决过程,包括理解问题、自己代码的探索和错误排查、与老师代码的对比、以及从中学习到的知识点。
    C++ 参考手册
    在这里插入图片描述

💯 题目描述:质因数分解

已知正整数 n n n 是两个不同的质数的乘积,试求出较大的那个质数。

输入格式

输入只有一行,包含一个正整数 n n n 6 < n < 1 0 9 6 < n < 10^9 6<n<109)。

输出格式

输出只有一行,包含一个正整数 p p p,即较大的那个质数。

输入输出样例:

输入:

21

输出:

7

💯 问题解析

要解答本题,首先需要理解题目中的关键概念:

1. 质数的定义

质数是一个大于 1 的正整数,且除了 1 和自身之外,不可被其他数整除。例如,2、3、5、7 是质数,而 4、6、9 不是质数。

2. 题目特点

根据题意,输入的 n n n 是两个不同质数的乘积:
n = m 1 × m 2 n = m_1 \times m_2 n=m1×m2
其中 m 1 m_1 m1 m 2 m_2 m2 都是质数,且 m 1 ≠ m 2 m_1 \neq m_2 m1=m2。需要输出较大的质数 m 2 m_2 m2

3. 约束范围

6 < n < 1 0 9 6 < n < 10^9 6<n<109。这一范围很大,因此暴力解法需要优化。

4. 问题分解

  • 找到 n n n 的两个因子 m 1 m_1 m1 m 2 m_2 m2
  • 验证它们是否为质数。
  • 输出较大的因子 m 2 m_2 m2

💯 解题过程

在解题过程中,我们先后尝试了自己的方法和老师的方法,同时通过不断调整和优化代码,逐步发现并解决了问题。

我的初始代码与错误

代码尝试 1:错误的暴力解法

初始时,我采用了一种双重循环的方法,从 i = 1 i = 1 i=1 开始遍历所有可能的因子组合,并比较大小:

#include <iostream>
using namespace std;

int main() {
    int n = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = i; j < n; j++) {
            if (i * j == n) {
                if (i > j)
                    cout << i << endl;
                else
                    cout << j << endl;
            }
        }
    }
    return 0;
}

在这里插入图片描述

问题分析:

  1. 逻辑错误:
    • 双重循环虽然遍历了所有可能的因子组合,但没有判断因子是否是质数。
    • 不符合题目要求,结果不一定正确。
  2. 效率低下:
    • 两层循环的时间复杂度是 O ( n 2 ) O(n^2) O(n2)。对于题目输入范围( n < 1 0 9 n < 10^9 n<109),运行时间过长,导致超时(TLE)。

错误修正:使用单层循环优化

我尝试用单层循环替代双重循环,从 2 开始查找因子:

#include <iostream>
using namespace std;

int main() {
    int n = 0;
    cin >> n;
    for (int i = 2; i < n; i++) {
        double m = n * 1.0 / i;
        if (n / i == m) {
            cout << m << endl;
            break;
        }
    }
    return 0;
}

问题分析:

  1. 浮点数误差:
    • 使用 double 存储因子可能导致计算精度问题。
    • 如输入较大值,可能因浮点数误差导致判断错误。
  2. 缺乏质数判断:
    • 即使结果符合 i × j = n i \times j = n i×j=n i i i j j j 也不一定是质数。

老师的做法与分析

老师的代码:

老师的代码更简洁,利用了 n % i == 0 的逻辑直接判断因子,同时通过 break 提前终止循环:

#include <iostream>
using namespace std;

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

    for (int i = 2; i < n; i++) {
        if (n % i == 0) {
            cout << n / i << endl;
            break;
        }
    }

    return 0;
}

分析:

  1. 简洁性:
    • 利用 n % i == 0 查找最小因子 m 1 m_1 m1,直接计算出另一个因子 m 2 = n / m 1 m_2 = n / m_1 m2=n/m1
    • 输出 m 2 m_2 m2 时无需额外判断,因为较大的因子总是 m 2 m_2 m2
  2. 效率:
    • 单层循环,复杂度为 O ( n ) O(n) O(n)。适用于小范围的 n n n
  3. 缺陷:
    • 没有判断 m 1 m_1 m1 m 2 m_2 m2 是否为质数。
    • n n n 不满足题目要求(即 n n n 不等于两个质数的乘积),结果不一定正确。

改进与优化

在学习老师代码的基础上,我们对算法进行了改进,以提升效率和保证正确性。

改进点 1:限制循环范围

  • 根据因子分布规律,较小因子必然小于 n \sqrt{n} n
  • 只需遍历 2 2 2 n \sqrt{n} n 。复杂度降为 O ( n ) O(\sqrt{n}) O(n )

改进点 2:质数判断

  • 增加一个辅助函数 isPrime 判断因子是否为质数:
bool isPrime(int x) {
    if (x < 2) return false;
    for (int i = 2; i <= sqrt(x); i++) {
        if (x % i == 0) return false;
    }
    return true;
}

最终代码:

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

bool isPrime(int x) {
    if (x < 2) return false;
    for (int i = 2; i <= sqrt(x); i++) {
        if (x % i == 0) return false;
    }
    return true;
}

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

    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            int j = n / i;
            if (isPrime(i) && isPrime(j)) {
                cout << max(i, j) << endl;
                return 0;
            }
        }
    }

    return 0;
}

完整解析

思路总结:

  1. 限制因子查找范围到 2 2 2 n \sqrt{n} n
  2. 对每个找到的因子 i i i,计算另一个因子 j = n / i j = n / i j=n/i
  3. 判断 i i i j j j 是否为质数。
  4. 输出较大的质数因子。

复杂度分析:

  • 主循环: O ( n ) O(\sqrt{n}) O(n )
  • 质数验证: 对每个因子进行一次 O ( factor ) O(\sqrt{\text{factor}}) O(factor ) 的检查。
  • 总复杂度: 接近 O ( n ) O(\sqrt{n}) O(n )

💯小结

本题通过分析因子规律和质数特性,最终实现了从 O ( n 2 ) O(n^2) O(n2) O ( n ) O(\sqrt{n}) O(n ) 的优化。题目看似简单,但其中蕴含了许多算法优化的技巧和数学思想。通过这次练习,我们不仅掌握了质数分解的基本方法,也学习了如何通过数学推导减少计算量,提高程序的运行效率。


在这里插入图片描述


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

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

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

相关文章

Unity中列表List使用出类似字典Dictionary的感觉

首先为什么会有这个标题&#xff1f; 因为字典很好用&#xff0c;只需要键就能拿到值&#xff0c;这种感觉是真的爽&#xff0c;新手最喜欢用了&#xff0c;遇事不决就字典&#xff0c;但是也有不好的地方&#xff0c;字典的内存开销比列表List要大&#xff0c;遍历也是List占…

分布式项目___某污水处理项目

一.分布式项目___污水处理项目 项目地址:https://gitee.com/yanyigege/collaborative-water-springboot.git ​ 1.项目背景 总公司在全国各地有处理污水的项目部,各项目部处理自己的污水,总部需要监控各地分项目部每天处理污水的原料用量,掌握各分部的污水处理情况 ​ 2.功…

WebRTC:实现浏览器与移动应用的实时通信

1.技术简介 &#xff08;Web Real-Time&#xff09;是一种开放式实时通信技术&#xff0c;旨在使浏览器和移动应用程序通过简单的API即可实现实时音频、视频和数据传输&#xff0c;而无需安装插件或额外软件。它支持网络应用中的点对点通信&#xff0c;例如视频聊天、语音通话…

小程序基础 —— 07 创建小程序项目

创建小程序项目 打开微信开发者工具&#xff0c;左侧选择小程序&#xff0c;点击 号即可新建项目&#xff1a; 在弹出的新页面&#xff0c;填写项目信息&#xff08;后端服务选择不使用云服务&#xff0c;开发模式为小程序&#xff0c;模板选择为不使用模板&#xff09;&…

数据结构之线性表之链表(附加一个考研题)

链表的定义 链表的结构&#xff1a; 单链表-初始化 代码实现&#xff1a; 单链表-头插法 代码实现&#xff1a; 这里我给大家分析一下 我们每创建一个新的节点都要插在头节点的后面&#xff0c;我们一定要注意顺序 一定要先让新节点指向头节点指向的下一个节点&#xff0c;…

RocketMQ(二)RocketMQ实战

文章目录 一、RocketMQ实战1.1 批量消息发送1.2 消息发送队列自选择1.3 事务消息1.4 SpringCloud集成RocketMQ 二、最佳实践2.1 生产者2.1.1 发送消息注意事项2.1.2 消息发送失败处理方式 2.2 消费者2.2.1 消费过程幂等2.2.2 消费打印日志 2.3 Broker 三、相关问题3.1 为什么要…

Vue router router-link router-view keep-alive

Vue router router-link router-view keep-alive keep-alive 1. /:id 2 ?id

掌握 PostgreSQL 的 psql 命令行工具

title: 掌握 PostgreSQL 的 psql 命令行工具 date: 2024/12/30 updated: 2024/12/30 author: cmdragon excerpt: psql 是 PostgreSQL 关系数据库管理系统的交互式命令行工具,是数据库管理员和开发人员进行数据库管理和操作的主要接口。熟练使用 psql 工具,不仅能够提高对 …

【C++】深入理解 break 和 continue 语句

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;break 和 continue 介绍**break** 的作用**continue** 的作用注意事项 &#x1f4af;break 示例代码示例**执行结果****解析过程** &#x1f4af;continue 示例代码示例&am…

【C++】B2064 斐波那契数列

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式输入输出样例输入输出 &#x1f4af;思路分析**题目本质** &#x1f4af;代码实现与对比**我的代码实现**代码展示思路解析优点不足 **老师的代码…

在 Ubuntu 24.04.1 LTS | Python 3.12 环境下部署 Crypto 库

测试一些密码学方案需要用到 Crypto 库&#xff0c;网上教程大多针对 Windows 和 Python 3.10 或以下的环境&#xff0c;所以写下了这篇博文。 部署与使用 首先执行 su 输入密码进入超级用户&#xff0c;部署完 Python 3.12 环境后&#xff0c;执行以下命令进行安装&#xff…

【ArcGIS Pro/GeoScene Pro】可视化时态数据

可视化过去二十年新西兰国际旅游业的发展变化 工程数据下载 ArcGIS Pro 快速入门指南—ArcGIS Pro | 文档 添加数据 数据为中国旅客数据 转置表字段 列数据转行数据

Junit4单元测试快速上手

文章目录 POM依赖引入业务层测试代码Web层测试代码生成测试类文件 在工作中我用的最多的单元测试框架是Junit4。通常在写DAO、Service、Web层代码的时候都会进行单元测试&#xff0c;方便后续编码&#xff0c;前端甩锅。 POM依赖引入 <dependency><groupId>org.spr…

HTML——24.图片引入1

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>图片的引入</title></head><body><!--网页中引入图片&#xff1a;使用img标签&#xff0c;<img src"图片路径"/>--><!--src属性…

云计算基础实验

云计算基础实验报告 实验一 Linux环境下算法的测试 一&#xff0c; 根据基本计算思想&#xff0c;验证和求解&#xff0c;设计算法。 根据运行需要&#xff0c;自行完成&#xff08;C和Python&#xff09;环境配置。 1.1验证卡布列克常数6174 原理过程&#xff1a; 循环输…

京东供应链创新与实践:应用数据驱动的库存选品和调拨算法提升履约效率

2024 年度总结系列 2024 年 10 月&#xff0c;京东零售供应链技术团队凭借其在库存选品与调拨技术上的创新与实践&#xff0c;荣获运筹与管理学领域的国际顶级奖项 Daniel H. Wagner Prize。本文为您介绍获奖背后的供应链技术创新和落地应用。 00 摘要 在电商行业中&#x…

按照人们阅读Excel习惯来格式化BigDecimal

1、环境/问题描述 使用springboot发送邮件(附件)的方式将月度报表发送给领导查阅&#xff0c;数据是准确的&#xff0c;领导基本满意。 就是对一些数字的格式化提出了改进建议&#xff0c;比如不要让大数字自动转为科学计数法、浮点数小数点后都是0就不要带出来&#xff0c;根…

软体机器人研究报告:设计方法、材料与驱动、感知与控制

软体机器人因其出色的可变形性和高适应性受到了广泛关注&#xff0c;这些特性使其在医疗、救援、探测等复杂场景中展现出独特的优势和巨大的应用潜力。研究人员对软体机器人的设计方法、材料与驱动技术、感知与控制策略等方面进行深入研究&#xff0c;取得了一系列成果。 本文汇…

医疗数仓业务数据采集与同步

业务数据采集与同步 业务采集组件配置业务数据同步概述数据同步策略选择数据同步工具概述1.1.4 全量表数据同步DataX配置文件生成全量表数据同步脚本增量表数据同步 MySQL - Maxwell - Kafka - Flume - HDFSMaxwell配置增量表首日全量同步 业务采集组件配置 Maxwell将业务采集到…

神经网络-VggNet

2014年VggNet被推出&#xff0c;获取了ILSVRC2014比赛分类项目的第二名&#xff0c;第一名是GoogleNet&#xff0c;该网络在下节介绍&#xff0c;本节主要介绍VggNet。 VggNet可以称为是一个家族&#xff0c;根据层数的不同包括了A、A-LRN、B、C、D等网络结构&#xff0c;其中…