【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。虚函数是为了,父子类中只有一个该函数。如果在子类重写虚函数,那么用的就是子类重写的虚函数;如果子类没有重写虚函数,那么调用的是父类继承的虚函…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
