【C/C++】【基础数论】33、算数基本定理
算术基本定理,又称正整数的唯一分解定理。
说起来比较复杂,但是看一下案例就非常清楚了
任何一个大于 1 的正整数都可以唯一地分解成有限个质数的乘积形式,且这些质数按照从小到大的顺序排列,其指数也是唯一确定的。
例如,整数 60 可以分解为 2×2×3×5,这里的 2、3、5 都是质数,且这种分解方式是唯一的。
质数
如果一个数除了 1 和本身,没有其他的因数,就是质数。
合数
如果一个数除了 1 和本身,还有其他的因数,就是合数。
1 既不是质数,也不是合数。
一点一点过度,别着急,先看一下质数怎么判断
#include <iostream>
using namespace std;int main()
{int n;cin >> n;// 初始化标志变量,默认 n 是质数bool flag = true; for (int i = 2; i <= n; i++){// 如果 n 能被 i 整除if (n % i == 0) {// 将标志变量设为 false,表示 n 不是质数flag = false; // 跳出循环,因为已经确定 n 不是质数了break; }}// 根据标志变量的值输出结果if (flag){cout << n << "是质数。" << endl;}else{cout << n << "不是质数。" << endl;}return 0;
}
初学者是不是都这么写,可能还不屑注释,一堆字母就完事了?
这个写法没毛病,但是执行效率可能不是很高,因为所有的数都要从2到n来除一遍。来看看,稍微升级一点的写法,
#include <iostream>
#include <cmath>
#include <limits>int main() {int n;// 进入一个无限循环,直到输入有效为止while (true) {cout << "请输入一个正整数:";// 尝试读取输入到 n,如果读取成功并且 n 大于 1if (cin >> n && n > 1) {// 跳出循环,输入有效break;} else {// 清除输入流的错误状态标志cin.clear();// 忽略输入流中的剩余字符直到遇到换行符,防止错误输入影响后续输入cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');cout << "输入无效,请重新输入。" << endl;}}bool isPrime = true;// 从 2 开始循环到 n 的平方根(优化后的质数判断范围)for (int i = 2; i <= sqrt(n); i++) {// 如果 n 能被 i 整除if (n % i == 0) {// 将标志变量设为 false,表示 n 不是质数isPrime = false;// 跳出循环,因为已经确定 n 不是质数了break;}}// 根据标志变量的值输出结果if (isPrime) {cout << n << "是质数。" << endl;} else {cout << n << "不是质数。" << endl;}return 0;
}
很多人可能像我一样刚开始学的时候一样,有个疑问。sqrt是干嘛的,为啥这么写。
在这段代码中,sqrt(n)
表示对变量n
取算术平方根。
sqrt
是 C++ 标准库中<cmath>
头文件里定义的一个函数,它接受一个参数并返回该参数的算术平方根。- 在这个代码片段中,通过遍历从 2 到
sqrt(n)
的整数来判断n
是否为质数。这样做的目的是优化判断质数的过程。因为如果一个数n
不是质数,那么它一定存在一个小于等于sqrt(n)
的因子(除了 1 和n
本身)。例如,如果n = 100
,那么sqrt(100)=10
,在判断 100 是否为质数时,只需要检查从 2 到 10 的整数是否能整除 100 即可,而不需要检查到 99,大大减少了循环次数,提高了程序的效率。
可以这么理解,一个数如果能被开平方得到一个新的整数,那么这个数一定不是质数。
因为能被开平方得到整数意味着该数存在一个相同的因数与其自身相乘得到这个数,比如 9 能被开平方为 3,9 = 3×3,有除了 1 和它本身之外的因数 3,所以不是质数。
比如 41 不能被开平方得到一个整数,41 是质数。
而质数只能被 1 和它自身整除,不存在可以开平方得到但是还是质数的情况的情况。
大大减少了循环次数,提高了程序的效率。
而算术基本定理又称正整数的唯一分解定理,它不完全等同于单纯的分解质因数,但可以通过分解质因数来体现。
算术基本定理指出:任何一个大于 1 的正整数都可以唯一地分解成有限个质数的乘积形式,且这些质数按照从小到大的顺序排列,其指数也是唯一确定的。
举个例子,整数 60 可以分解为,这里的 2、3、5 都是质数,且这种分解方式是唯一的。
而分解质因数只是实现算术基本定理的一种操作手段,算术基本定理强调的是正整数分解为质数乘积的唯一性这一本质属性。
一般我们编程思想和我们数学中用到的短除法非常的类似。简单来说,短除法就是不断地用最小的质因数除以它本身。
给你一个数,你怎么快速分解出他的质因数。就用这个方法。
比如100的质因数是2*2*5*5;那我们利用短除法来求一下。
我们用代码来拆解一下
#include <iostream>
using namespace std;int main()
{// 输入int n;cin >> n;// 输出提示信息cout << n << "的质因数分解为:";// 分解质因数for (int i = 2; i <= n; i++){// 当 n 能被 i 整除时,进入循环while (n % i == 0){// 输出质因数 icout << i << " ";// 将 n 更新为 n 除以 i 的结果n /= i;}}cout << endl;return 0;
}
步骤说明:
- 首先从用户处获取一个整数
n
。int n; cin >> n;
:定义变量n
并读取用户输入的整数。
- 输出提示信息,让用户知道即将看到的是输入整数的质因数分解结果。
cout << n << "的质因数分解为:";
:输出提示语句。
- 从
i = 2
开始尝试分解质因数,因为 2 是最小的质数。for (int i = 2; i <= n; i++)
:循环从 2 开始,一直到等于n
,确保所有可能的质因数都被考虑到。
- 当
n
能被i
整除时,进入循环,不断输出i
并更新n
。while (n % i == 0)
:只要n
能被i
整除,就一直循环。cout << i << " ";
:输出找到的质因数i
。n /= i;
:将n
更新为n
除以i
的结果,以便继续寻找下一个质因数。
例如,输入整数 120:
- 首先读取输入的 120。
- 输出提示信息 “120 的质因数分解为:”。
- 从
i = 2
开始:- 120 能被 2 整除,输出 2,
n
变为 60。 - 60 能被 2 整除,再次输出 2,
n
变为 30。 - 30 能被 2 整除,又输出 2,
n
变为 15。
- 120 能被 2 整除,输出 2,
i = 3
时:15 能被 3 整除,输出 3,n
变为 5。i = 4
不满足循环条件,继续下一个数。i = 5
时:5 能被 5 整除,输出 5,此时n
变为 1,循环结束。
最终输出结果为 “120 的质因数分解为:2 2 2 3 5”。
好了,有任何问题我们来评论区讨论一下吧
相关文章:

【C/C++】【基础数论】33、算数基本定理
算术基本定理,又称正整数的唯一分解定理。 说起来比较复杂,但是看一下案例就非常清楚了 任何一个大于 1 的正整数都可以唯一地分解成有限个质数的乘积形式,且这些质数按照从小到大的顺序排列,其指数也是唯一确定的。 例如&#…...

聚簇索引与非聚簇索引
物理存储方式不同: 1. InnoDb默认数据结构是聚簇索引;MyISAM 是非聚簇索引 2. 聚簇索引 中表索引与数据是在一个文件中 .ibd;非聚簇索引中表索引(.MYI)与数据(.MYD)是在两个文件中 3. 聚簇索引中表数据行都存放在索引树…...

“类型名称”在Go语言规范中的演变
Go语言规范(The Go Programming Language Specification)[1]是Go语言的核心文档,定义了该语言的语法、类型系统和运行时行为。Go语言规范的存在使得开发者在实现Go编译器时可以依赖一致的标准,它确保了语言的稳定性和一致性&#…...

c++----继承(初阶)
大家好呀,今天我们也是多久没有更新博客了,今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢,大家从字面意思看,是不是像我们平常日常生活中很容易出现的,比如说电视剧里面什么富豪啊,去了…...
数据库系列(1)常见的四种非关系型数据库(NoSQL)
非关系型数据库(NoSQL) 非关系型数据库适用于需要灵活数据模型和高可扩展性的场景。常见的非关系型数据库包括: MongoDB:文档数据库,以JSON-like格式存储数据,适合快速开发和迭代。Cassandra:…...

大规模预训练语言模型的参数高效微调
人工智能咨询培训老师叶梓 转载标明出处 大规模预训练语言模型(PLMs)在特定下游任务上的微调和存储成本极高,这限制了它们在实际应用中的可行性。为了解决这一问题,来自清华大学和北京人工智能研究院的研究团队探索了一种优化模型…...

一场大模型面试,三个小时,被撞飞了
去华为面试大模型,一点半去五点半回,已经毫无力气。 1️⃣一轮面试—1小时 因为一面都是各个业务的主管,所以专业性很强,面试官经验很丰富,建议大家还是需要十分熟悉所学内容,我勉强通过一面。 2️⃣二轮…...
Python每次for循环向list中添加多个元素
Python中,我每次for loop要产生几个结果。要将这些结果加到一个list中。怎么最高效? 答: list extend 方法 在Python中,如果你想在循环中将多个元素添加到列表中,最直接和最高效的方式是使用列表的 append() 方法。每次循环时&a…...

Java爬虫抓取数据的艺术
在信息时代,数据的重要性不言而喻。对于Java开发者来说,掌握如何使用Java进行数据抓取是一项宝贵的技能。通过编写爬虫程序,我们可以从互联网的海量信息中提取有价值的数据,用于市场分析、客户洞察、内容监控等多种场景。本文将介…...

Unity场景内画车道线(根据五阶曲线系数)
之前做过使用Dreamteck Splines插件构建车道线之前需求是给定车道线的点位,根据点位来进行构建。 由于AI识别出来的点位不线性,画出来的车道线经常是歪七扭八,所以使用五阶曲线系数进行构建。 使用在线图形计算器进行测试构建,公式…...

IPLOOK百万级用户容量核心网惊艳亮相北京PT展
2024年9月25日,以“推动数实深度融合,共筑新质生产力”为主题,本届中国国际信息通信展(PT展)在北京国家会议中心正式拉开帷幕。 广州爱浦路网络技术有限公司(简称:IPLOOK)ÿ…...
家庭网络的ip安全性高吗
家庭网络的IP安全性是一个重要的话题,涉及到如何保护家庭设备和用户的隐私。家庭网络的安全性既有其优势,也存在一些潜在的风险。以下是关于家庭网络IP安全性的几个关键点: 1. 家庭网络的优势 私有IP地址的使用 家庭网络中的设备通常使用私…...
LLM阅读推荐
(按名称排序) 【徹底解説】これからのエンジニアの必携スキル、プロンプトエンジニアリングの手引「Prompt Engineering Guide」を読んでまとめてみた(opens in a new tab)3 Principles for prompt engineering with GPT-3(opens in a new tab)A beginn…...
计算机网络笔记001
讲义 1.计算机网络的定义 定义: 一批独立自治的计算机系统的互连集合体 说明: 独立自治的计算机系统, 互连的手段是各种各样的, 依据协议进行 工作 2.计算机网络和通信网络 通信网络: 重点研究通…...

如何用IDEA连接HBase
编写java代码,远程连接HBase进行相关的操作 一、先导依赖 代码如下: 二、连接成功...
【JS代码规范】如何优化if-else代码规范
1. 快速结束,减少没必要的else 案例一:2种互斥的条件判断 function test(data) {let result ;if (data < 0) {result 负数;} else {result 非负数;}return result; }优化一: function test(data) {if (data < 0) {return 负数;} …...

MovieLife 电影生活
MovieLife 电影生活 今天看到一个很有意思的项目:https://www.lampysecurity.com/post/the-infinite-audio-book “我有一个看似愚蠢的想法。通常,这类想法只是一闪而过,很少会付诸实践。但这次有所不同。假如你的生活是一部电影,…...
网工内推 | 中级云运维工程师,双休,五险一金
01 博达人才 🔷招聘岗位:中级云运维工程师 🔷岗位职责 1、受理数据中心、云租户投诉、受理故障工单,并在时限内完成。 2、协助客户开通云产品,解答客户使用过程中的疑问。 3、处理云产品故障,协助进行故…...

Thingsboard规则链:Related Entity Data节点详解
引言 在复杂的物联网(IoT)生态系统中,数据的集成与分析是实现高效管理和智能决策的基础。Thingsboard作为一个强大的开源物联网平台,其规则链(Rule Chains)机制允许用户构建自定义的数据处理流程。其中&am…...

C++结尾
面试题 1.什么是虚函数?什么是纯虚函数 在定义函数时前面加virtual。虚函数是为了,父子类中只有一个该函数。如果在子类重写虚函数,那么用的就是子类重写的虚函数;如果子类没有重写虚函数,那么调用的是父类继承的虚函…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...