当前位置: 首页 > news >正文

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

C++17 std__lcm 博客.png

文章目录

    • 一、引言
    • 二、`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 是一个模板函数,支持 intlonglong 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> 头文件,定义了两个整数 num1num2,然后调用 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 函数传入三个整数 num1num2num3,函数会计算这三个整数的最小公倍数。

五、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;
}

七、注意事项

  1. 输入参数类型std::lcm 函数是模板函数,支持整数类型。在使用时,确保传入的参数类型是兼容的整数类型,否则可能会导致编译错误。
  2. 溢出问题:在计算最小公倍数时,由于涉及乘法运算,可能会导致整数溢出。特别是对于较大的整数,需要注意溢出的可能性。
  3. constexpr 特性:由于 std::lcmconstexpr 函数,可以在编译时计算结果。在一些场景中,可以利用这个特性来提高代码的性能,例如在编译时计算数组的大小等。

八、总结

C++17 中的 std::lcm 函数为计算整数的最小公倍数提供了一种简洁高效的方式。通过本文的介绍,你已经了解了 std::lcm 的基本概念、使用方法、实现原理以及在实际项目中的应用。希望这些知识能够帮助你在 C++ 编程中更好地处理数学运算相关的问题。在实际应用中,合理使用 std::lcm 函数,可以提高代码的可读性和性能,使你的程序更加健壮和高效。

相关文章:

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

文章目录 一、引言二、std::lcm 的基本概念三、入门示例四、计算多个整数的最小公倍数五、std::lcm 的实现原理六、在实际项目中的应用七、注意事项八、总结 一、引言 在 C 编程中&#xff0c;处理数学运算时&#xff0c;计算最小公倍数&#xff08;Least Common Multiple&…...

初阶c语言(循环语句习题,完结)

前言&#xff1a; c语言为b站鹏哥&#xff0c;嗯对应视频37集 昨天做的c语言&#xff0c;今天在来做一遍&#xff0c;发现做错了 今天改了平均值的计算&#xff0c; 就是说最大值加上最小值&#xff0c;如果说这个数值非常大的话&#xff0c;两个值加上会超过int类型的最大…...

本地Deepseek-r1:7b模型集成到Google网页中对话

本地Deepseek-r1:7b网页对话 基于上一篇本地部署的Deepseek-r1:7b&#xff0c;使用黑窗口对话不方便&#xff0c;现在将本地模型通过插件集成到Google浏览器中 安装Google插件 在Chrome应用商店中搜索page assis 直接添加至Chrome 修改一下语言 RAG设置本地运行的模型&#…...

SSM课设-学生选课系统

【课设者】SSM课设-学生选课系统 分为 管理员 和 老师 和 学生端 技术栈 前端: HtmlCssJavaScriptAjax 后端: Spring、Spring MVC、MyBatis、MySQL、JSP 学生端 --选课 选课 搜索 --查看选课结果 --退选 --查看已修课程 --管理个人信息 老师端 --添加教学课程 添加 …...

Windows中使用Docker安装Anythingllm,基于deepseek构建自己的本地知识库问答大模型,可局域网内多用户访问、离线运行

文章目录 Windows中使用Docker安装Anythingllm&#xff0c;基于deepseek构建自己的知识库问答大模型1. 安装 Docker Desktop2. 使用Docker拉取Anythingllm镜像2. 设置 STORAGE_LOCATION 路径3. 创建存储目录和 .env 文件.env 文件的作用关键配置项 4. 运行 Docker 命令docker r…...

AI前端开发技能提升与ScriptEcho:拥抱AI时代的前端开发新范式

随着人工智能技术的飞速发展&#xff0c;AI前端开发岗位对技能的要求也水涨船高。越来越多的企业需要具备AI相关知识和高级前端开发能力的工程师&#xff0c;这使得传统的前端开发模式面临着巨大的挑战。如何提升开发效率&#xff0c;降低人力成本&#xff0c;成为了摆在所有前…...

【Redis存在线程安全问题吗?】

Redis存在线程安全问题吗? Redis的线程安全性概述Redis线程安全性的挑战Redis线程安全性的示例示例1:客户端并发访问导致的问题示例2:分布式环境下的问题解决Redis线程安全问题的建议总结Redis的线程安全性概述 Redis本身是一个单线程的键值存储数据库,它使用单线程模型来…...

碎碎念,再聊HyperRAM(CrosslinkNX FPGA+HyperRAM)

作者&#xff1a;Hello&#xff0c;Panda HyperRAM其实熊猫君很久以前在用了&#xff0c;几年前也分享了一篇实现HyperRAM控制器的博文&#xff08;博文《Lattice CrossLinkNx LIFCL-40应用连载7-使用HyperRAM存储器》。近期在后台收到好几位朋友咨询一些关于HyperRAM的问题&a…...

左移架构 -- 从攒批,湖仓到使用数据流的实时数据产品

编辑导读: 这篇文章翻译自 Kai Waehner的 《The Shift Left Architecture – From Batch and Lakehouse to Real-Time Data Products with Data Streaming》。文章通过数据产品的概念引出了如何创建可重复使用的数据产品使企业能够从当前和未来的数据中获得价值。基于构建数据产…...

多模态识别和自然语言处理有什么区别

在科技飞速发展的当下&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。不知道大家有没有这样的经历&#xff1a;早上醒来&#xff0c;对着智能音箱说 “播放今天的新闻”&#xff0c;音箱不仅能识别你的语音&#xff0c;还能在播放新闻的同时&am…...

进阶——第十六蓝桥杯嵌入式熟练度练习(串口的小BUG补充-字符接受不完整和字符接受错误)

1.解决接受不完整问题 假如没接受完成&#xff0c;执行函数&#xff0c;就可能会把count直接清零&#xff0c;就会重新接受\ while (1){if(rx_count!0){uint8_t temprx_count;HAL_Delay(1);if(temprx_count)uart_proc(); }key_proc();rxclear_proc();/* USER CODE END WHILE…...

数据结构-链式二叉树

文章目录 一、链式二叉树1.1 链式二叉树的创建1.2 根、左子树、右子树1.3 二叉树的前中后序遍历1.3.1前(先)序遍历1.3.2中序遍历1.3.3后序遍历 1.4 二叉树的节点个数1.5 二叉树的叶子结点个数1.6 第K层节点个数1.7 二叉树的高度1.8 查找指定的值(val)1.9 二叉树的销毁 二、层序…...

【git-hub项目:YOLOs-CPP】本地实现01:项目构建

目录 写在前面 项目介绍 最新发布说明 Segmentation示例 功能特点 依赖项 安装 克隆代码仓库 配置 构建项目 写在前面 前面刚刚实现的系列文章: 【Windows/C++/yolo开发部署01】 【Windows/C++/yolo开发部署02】 【Windows/C++/yolo开发部署03】 【Windows/C++/yolo…...

250213-RHEL8.8-外接SSD固态硬盘

It seems that the exfat-utils package is still unavailable, even after enabling the RPM Fusion repository. This could happen if the repository metadata hasn’t been updated or if the package isn’t directly available in the RPM Fusion repository for RHEL 8…...

如何本地部署DeepSeek?

DeepSeek&#xff1a;智能时代的得力助手 在人工智能技术飞速发展的今天&#xff0c;DeepSeek 作为一款由国内顶尖团队研发的 AI 工具&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;逐渐在众多同类产品中脱颖而出&#xff0c;成为众多用户在工作和学习中的得力助手。 …...

leetcode:627. 变更性别(SQL解法)

难度&#xff1a;简单 SQL Schema > Pandas Schema > Salary 表&#xff1a; ----------------------- | Column Name | Type | ----------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int …...

51单片机(国信长天)矩阵键盘的基本操作

在CT107D单片机综合训练平台上&#xff0c;首先将J5处的跳帽接到1~2引脚&#xff0c;使按键S4~S19按键组成4X4的矩阵键盘。在扫描按键的过程中&#xff0c;发现有按键触发信号后(不做去抖动)&#xff0c;待按键松开后&#xff0c;在数码管的第一位显示相应的数字:从左至右&…...

封装一个sqlite3动态库

作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目案例 二…...

Transformer以及BERT阅读参考博文

Transformer以及BERT阅读参考博文 Transformer学习&#xff1a; 已有博主的讲解特别好了&#xff1a; 李沐&#xff1a;Transformer论文逐段精读【论文精读】_哔哩哔哩_bilibili知乎&#xff1a;Transformer模型详解&#xff08;图解最完整版&#xff09; - 知乎 个人杂想&…...

AI学习记录 - 最简单的专家模型 MOE

代码 import torch import torch.nn as nn import torch.nn.functional as F from typing import Tupleclass BasicExpert(nn.Module):# 一个 Expert 可以是一个最简单的&#xff0c; linear 层即可# 也可以是 MLP 层# 也可以是 更复杂的 MLP 层&#xff08;active function 设…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...