C++17 中 std::lcm:从入门到精通

文章目录
- 一、引言
- 二、`std::lcm` 的基本概念
- 三、入门示例
- 四、计算多个整数的最小公倍数
- 五、`std::lcm` 的实现原理
- 六、在实际项目中的应用
- 七、注意事项
- 八、总结
一、引言
在 C++ 编程中,处理数学运算时,计算最小公倍数(Least Common Multiple,LCM)是一个常见的需求。C++17 引入了 std::lcm 函数,为开发者提供了一种方便快捷的方式来计算两个或多个整数的最小公倍数。本文将详细介绍 std::lcm 的用法,从基础的入门示例到深入的应用场景,帮助你全面掌握这个函数。
二、std::lcm 的基本概念
最小公倍数是指两个或多个整数公有的倍数中最小的一个。例如,对于整数 4 和 6,它们的公倍数有 12、24、36 等,其中 12 是最小的公倍数。std::lcm 函数就是用来计算这种最小公倍数的工具。
std::lcm 函数定义在 <numeric> 头文件中,其函数原型如下:
// 计算两个整数的最小公倍数
template<class T>
constexpr T lcm(T a, T b);// 计算多个整数的最小公倍数
template<class T, class... Args>
constexpr T lcm(T a, Args... args);
std::lcm 是一个模板函数,支持 int、long、long long 等整数类型,并且是 constexpr 函数,这意味着它可以在编译时进行计算,提高了代码的性能。
三、入门示例
下面是一个简单的示例,展示如何使用 std::lcm 计算两个整数的最小公倍数:
#include <iostream>
#include <numeric>int main() {int num1 = 4;int num2 = 6;int result = std::lcm(num1, num2);std::cout << "The LCM of " << num1 << " and " << num2 << " is: " << result << std::endl;return 0;
}
在这个示例中,我们包含了 <iostream> 和 <numeric> 头文件,定义了两个整数 num1 和 num2,然后调用 std::lcm 函数计算它们的最小公倍数,并将结果输出到控制台。
四、计算多个整数的最小公倍数
std::lcm 不仅可以计算两个整数的最小公倍数,还可以计算多个整数的最小公倍数。以下是一个示例:
#include <iostream>
#include <numeric>int main() {int num1 = 4;int num2 = 6;int num3 = 8;int result = std::lcm(num1, num2, num3);std::cout << "The LCM of " << num1 << ", " << num2 << ", and " << num3 << " is: " << result << std::endl;return 0;
}
在这个示例中,我们调用 std::lcm 函数传入三个整数 num1、num2 和 num3,函数会计算这三个整数的最小公倍数。
五、std::lcm 的实现原理
std::lcm 函数的实现基于数学原理,利用了最大公约数(Greatest Common Divisor,GCD)的概念。最小公倍数和最大公约数之间有如下关系:
[ \text{lcm}(a, b) = \frac{|a \times b|}{\text{gcd}(a, b)} ]
在 C++ 中,std::gcd 函数也定义在 <numeric> 头文件中,用于计算两个整数的最大公约数。std::lcm 函数的实现通常会调用 std::gcd 函数来计算最小公倍数。
六、在实际项目中的应用
在实际项目中,std::lcm 函数可以用于解决各种与时间周期、数据采样等相关的问题。例如,假设有两个定时器,一个定时器的周期是 4 秒,另一个定时器的周期是 6 秒,我们想知道它们何时会同时触发,就可以使用 std::lcm 计算它们的最小公倍数,得到 12 秒,即每隔 12 秒两个定时器会同时触发。
以下是一个简单的代码示例,模拟两个定时器的情况:
#include <iostream>
#include <numeric>class Timer {
public:Timer(int period) : period_(period) {}int getPeriod() const { return period_; }
private:int period_;
};int main() {Timer timer1(4);Timer timer2(6);int lcm_result = std::lcm(timer1.getPeriod(), timer2.getPeriod());std::cout << "The timers will trigger simultaneously every " << lcm_result << " seconds." << std::endl;return 0;
}
七、注意事项
- 输入参数类型:
std::lcm函数是模板函数,支持整数类型。在使用时,确保传入的参数类型是兼容的整数类型,否则可能会导致编译错误。 - 溢出问题:在计算最小公倍数时,由于涉及乘法运算,可能会导致整数溢出。特别是对于较大的整数,需要注意溢出的可能性。
constexpr特性:由于std::lcm是constexpr函数,可以在编译时计算结果。在一些场景中,可以利用这个特性来提高代码的性能,例如在编译时计算数组的大小等。
八、总结
C++17 中的 std::lcm 函数为计算整数的最小公倍数提供了一种简洁高效的方式。通过本文的介绍,你已经了解了 std::lcm 的基本概念、使用方法、实现原理以及在实际项目中的应用。希望这些知识能够帮助你在 C++ 编程中更好地处理数学运算相关的问题。在实际应用中,合理使用 std::lcm 函数,可以提高代码的可读性和性能,使你的程序更加健壮和高效。
相关文章:
C++17 中 std::lcm:从入门到精通
文章目录 一、引言二、std::lcm 的基本概念三、入门示例四、计算多个整数的最小公倍数五、std::lcm 的实现原理六、在实际项目中的应用七、注意事项八、总结 一、引言 在 C 编程中,处理数学运算时,计算最小公倍数(Least Common Multiple&…...
html 点击弹出视频弹窗
一、效果: 点击视频按钮后,弹出弹窗 播放视频 二、代码 <div class="index_change_video" data-video-src="</...
docker安装mongo,导入、导出数据
1、docker安装mongo docker pull mongo docker run -d -p 27017:27017 --name mongodb mongodocker update mongodb --restartalways ## 开机自启动-d:表示以后台模式运行容器。 -p 27017:27017:将容器内部的 MongoDB 默认端口 27017 映射到宿主机的 27…...
代码随想录算法【Day44】
Day44 1143.最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size() 1, vector<int>(text2.size() 1, 0));for (int i 1; i < text1.size(); i) {for (int j 1; …...
项目总结:java agent的使用
测试团队会做java agent的事,实现测试模拟,各种数据采集等等工作,而这些不需要开发改代码来做到,只需要挂载下agent。 目录 javaagent认识和例子代码例子:java.lang.instrument自定义实现一个javaagentagent jar测试 回…...
使用 LangChain 对接硅基流动(SiliconFlow)API:构建一个智能对话系统
文章目录 什么是硅基流动(SiliconFlow)?LangChain 简介在 LangChain 中对接硅基流动步骤 1:安装必要的库步骤 2:设置 API 密钥步骤 3:编写代码代码解析步骤 4:运行代码如何扩展和改进总结 在现代…...
如何借助NoETL指标平台实现数据分析、决策的提效?
通常,企业通过明确分析目标、定位所需分析的数据,再通过多渠道汇集销售数据、客户反馈、市场调研等信息,经过数据清洗、缺失值处理及格式标准化等手段,运用描述性统计、回归分析、聚类分析及关联规则挖掘等多样分析方法࿰…...
Java--IO流详解 (上)--字符流
目录 IO流的概念 字符流 输入流 Reader核心方法 1.close() 2.mark(int readAheadLimit) 3.markSupported() 4.read() 5.read(char[] cbuf) 6.read(char[] cbuf, int off, int len) 7.read(CharBuffer target) 8.ready() 9.reset() 10.skip(long n) Reader 的常用…...
大模型语言简介
大模型语言能做什么 信息提取 将长段文字中的信息抽取出来并且以结构化的方式输出。相比起传统NLP的方式,大模型在泛化能力上有非常大的提升,并且开发成本要低2个数量级。应用场景包括:论文论点论据提取、用户画像提取、舆情分析、病例结构…...
手动配置IP
手动配置IP,需要考虑四个配置项: 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址:格式表现为点分十进制,如192.168.254.1 子网掩码:用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…...
Golang 进阶训练营
一、Golang 的 slice、map、channel 1.1 slice vs array a : make([]int, 100) //切片 b : [100]int{} //数组array需指明长度,长度为常量且不可改变 array长度为其类型中的组成部分(给参数为长度100的数组的方法传长度为101的会报错) array在…...
2-使用wifidog实现portal
wifidog是openwrt上面实现portal认证的一个开源工具,从网关端到服务器都帮你搭建好,通过学习wifidog的原理,后面就可以改造成自己需要的逻辑。 1. openwrt安装wifidog 添加源 vim 14.07/feeds.conf.defaultsrc-git wifidog https://github.c…...
Spring Boot + ShardingSphere 踩坑记
最近在准备秋招,偷了个轮子项目之后想改个分表,于是有了这篇文章。 省流:请使用shardingsphere-jdbc 5.5.2,并根据官方5.5.2版本文档进行配置,不要使用starter。此外,如果希望使用INTERVAL分片算法&#x…...
AI时代前端开发的创造力:解放还是束缚?
在人工智能(AI)快速发展的时代,AI技术的影响已经渗透到各个领域,从医疗保健到金融服务,再到创意产业。AI工具的出现,为前端开发带来了前所未有的效率提升,但也引发了人们对创造力的担忧…...
有哪些免费的SEO软件优化工具
随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…...
FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案
作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 基于AOP的数据字典实现…...
在Vue中,JavaScript数组常用方法,添加,插入,查找,删除等整理
在Vue中,JavaScript数组常用,添加,插入,查找,删除等整理 1.splice()方法可以直接修改原数组,通过指定要删除元素的索引来删除它。 例: let index // 要删除的元素的索引; this.array.splice(i…...
vue知识点2
1.methods和mounted的区别 methods是定义方法,不涉及到调用 mounted涉及到操作 所以methods后面是:,mounted后面是() 2.介绍一下emit的用法 如果子控件要调用父页面的方法,在父页面的子控件引用处&…...
node.js + html调用ChatGPTApi实现Ai网站demo(带源码)
文章目录 前言一、demo演示二、node.js 使用步骤1.引入库2.引入包 前端HTML调用接口和UI所有文件总结 前言 关注博主,学习每天一个小demo 今天是Ai对话网站 又到了每天一个小demo的时候咯,前面我写了多人实时对话demo、和视频转换demo,今天…...
14.Python生成器、迭代器、闭包、装饰器、元类、垃圾回收、内建函数
在 Python 中,生成器、迭代器、闭包、装饰器、元类、垃圾回收和内建函数是一些重要的概念和功能,它们对于编写高效、灵活的代码非常重要。下面我们逐一详细介绍这些概念及其用法。 1. 生成器(Generator) 生成器是一个函数&#…...
STM32+Proteus+DS18B20数码管仿真实验
1. 实验准备 硬件方面: 了解 STM32 单片机的基本原理和使用方法,本实验可选用常见的 STM32F103 系列。熟悉 DS18B20 温度传感器的工作原理和通信协议(单总线协议)。数码管可选用共阴极或共阳极数码管,用于显示温度值。…...
Vulhub靶机 ActiveMQ 反序列化漏洞(CVE-2015-5254)(渗透测试详解)
一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 漏洞版本:Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0 二、访问靶机IP 8161端口 默认账户密码 admin/admin,登录 此时qucues事件为空 1、使用jmet-0.1.0-all.jar工具将…...
ConcurrentHashMap扩容
目录 一、tryPreSize方法-初始化数组 二、tryPreSize方法-扩容标识戳 三、transfer方法-构建新数组 四、transfer方法-迁移数据 五、transfer方法-lastRun机制 六、helpTransfer方法-协助扩容 三种触发方式 达到了扩容的阈值 一、tryPreSize方法-初始化数组 // 扩容前…...
2025年二级建造师报名流程图解
2025年二级建造师报名时间!附报名流程! ⏰️已公布25年二建考试时间的省份如下: ️4月19日、20日考试的城市有:贵州 ️5月10日、11日考试的城市有:湖北、陕西、宁夏、甘肃、福建、浙江、江西、黑龙江、河南、湖南、…...
【自学笔记】人工智能基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 人工智能重点知识点总览一、基础概念与原理1.1 人工智能定义与发展1.2 算法与数据结构1.3 数学基础 二、机器学习2.1 监督学习2.2 无监督学习2.3 强化学习 三、深度…...
hexo 魔改 | 修改卡片透明度
hexo 魔改 | 修改卡片透明度 ** 博客食物用更佳 博客地址 ** 这是笔者自己瞎倒腾的。作为前端菜鸡一枚,大佬们随便看看就好~ 我用的主题是 butterfly 4.12.0 分析 通过开发者工具可以看出来卡片的背景和 --card-bg 变量有关 再在 sources 下的 css 文件夹下的…...
Golang的并发编程案例详解
Golang的并发编程案例详解 一、并发编程概述 并发编程是指程序中有多个独立的执行线索,并且这些线索在时间上是重叠的。在 Golang 中,并发是其核心特性之一,通过 goroutine 和 channel 来支持并发编程,使得程序可以更高效地利用计…...
【升级】阿里云对象存储 HTTPS 根证书升级公告
--时间打败一切...
贪心算法与动态规划的区别
贪心算法:每一步都选择当前最优解,期望通过局部最优达到全局最优。 动态规划:通过分解问题为子问题,存储并重用子问题的解,避免重复计算。 最简单的JS ACM代码举例 贪心算法:找零问题 function greed…...
策略模式-小结
总结一下看到的策略模式: A:一个含有一个方法的接口 B:具体的实行方式行为1,2,3,实现上面的接口。 C:一个环境类(或者上下文类),形式可以是:工厂模式,构造器注入模式,枚举模式。 …...
