C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现

文章目录
- 一、std::gcd 的基本用法
- (一)包含头文件
- (二)函数签名
- (三)使用示例
- 二、std::gcd 的实现原理
- 三、std::gcd 的优势
- (一)简洁易用
- (二)类型安全
- (三)编译时计算
- 四、实际应用场景
- (一)分数化简
- (二)数组分组
- (三)图形学中的坐标简化
在数学和编程中,最大公约数(GCD,Greatest Common Divisor)是一个非常重要的概念。它表示两个或多个整数共有约数中最大的一个。在 C++17 中,标准库引入了
std::gcd 函数,这使得计算最大公约数变得更加简单和高效。本文将详细介绍
std::gcd 的使用方法、实现原理以及一些实际应用场景。
一、std::gcd 的基本用法
(一)包含头文件
std::gcd 函数定义在头文件 <numeric> 中,因此在使用之前需要包含该头文件:
#include <numeric>
(二)函数签名
std::gcd 的函数签名如下:
template <typename M, typename N>
constexpr std::common_type_t<M, N> gcd(M m, N n);
M 和 N 是模板参数,表示输入的两个整数类型。
返回值是 std::common_type_t<M, N>,即两个输入类型 M 和 N 的公共类型。例如,如果输入是 int 和 long,返回值类型将是 long。
该函数是 constexpr,这意味着它可以在编译时计算结果,从而提高效率。
(三)使用示例
以下是一个简单的示例,展示如何使用 std::gcd 计算两个整数的最大公约数:
#include <iostream>
#include <numeric>int main() {int a = 48;int b = 18;int result = std::gcd(a, b);std::cout << "The GCD of " << a << " and " << b << " is " << result << std::endl;return 0;
}
输出:
The GCD of 48 and 18 is 6
二、std::gcd 的实现原理
std::gcd 的实现基于欧几里得算法(Euclidean Algorithm),这是一种高效的计算最大公约数的方法。其基本思想是:
对于两个正整数 a 和 b(假设 a > b),a 和 b 的最大公约数等于 b 和 a % b 的最大公约数。
重复上述步骤,直到其中一个数变为 0,此时另一个数即为最大公约数。
以下是 std::gcd 的一个可能的实现:
template <typename M, typename N>
constexpr std::common_type_t<M, N> gcd(M m, N n) {using T = std::common_type_t<M, N>;T a = std::abs(static_cast<T>(m));T b = std::abs(static_cast<T>(n));while (b != 0) {T temp = b;b = a % b;a = temp;}return a;
}
首先,将输入的两个数转换为它们的公共类型,并取绝对值,以确保输入为正整数。
然后,使用循环实现欧几里得算法,直到 b 为 0。
最终返回 a,即为最大公约数。
三、std::gcd 的优势
(一)简洁易用
std::gcd 提供了一个简洁的接口,使得计算最大公约数变得非常简单。开发者无需自己实现欧几里得算法,只需调用一个标准库函数即可。
(二)类型安全
std::gcd 使用模板参数和 std::common_type_t,能够自动处理不同类型的输入,并返回正确的类型。这不仅提高了代码的灵活性,还避免了类型不匹配的问题。
(三)编译时计算
由于 std::gcd 是 constexpr 函数,它可以在编译时计算结果。这意味着在运行时可以直接使用计算好的结果,从而提高程序的运行效率。
四、实际应用场景
(一)分数化简
在处理分数时,常常需要将分数化简为最简形式。最大公约数是化简分数的关键。例如,将分数 48/18 化简为最简形式:
#include <iostream>
#include <numeric>int main() {int numerator = 48;int denominator = 18;int gcd_value = std::gcd(numerator, denominator);numerator /= gcd_value;denominator /= gcd_value;std::cout << "Simplified fraction: " << numerator << "/" << denominator << std::endl;return 0;
}
输出:
Simplified fraction: 8/3
(二)数组分组
在某些算法中,需要将数组分成若干组,每组的大小相等且尽可能大。最大公约数可以用来确定每组的最佳大小。例如,将一个大小为 48 的数组分成若干组,每组大小为 18:
#include <iostream>
#include <numeric>int main() {int array_size = 48;int group_size = 18;int gcd_value = std::gcd(array_size, group_size);std::cout << "Maximum group size: " << gcd_value << std::endl;std::cout << "Number of groups: " << array_size / gcd_value << std::endl;return 0;
}
输出:
Maximum group size: 6
Number of groups: 8
(三)图形学中的坐标简化
在图形学中,处理坐标时常常需要将坐标简化为整数比例。最大公约数可以用于简化坐标。例如,将坐标 (48, 18) 简化为最简比例:
#include <iostream>
#include <numeric>int main() {int x = 48;int y = 18;int gcd_value = std::gcd(x, y);x /= gcd_value;y /= gcd_value;std::cout << "Simplified coordinates: (" << x << ", " << y << ")" << std::endl;return 0;
}
相关文章:
C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现
文章目录 一、std::gcd 的基本用法(一)包含头文件(二)函数签名(三)使用示例 二、std::gcd 的实现原理三、std::gcd 的优势(一)简洁易用(二)类型安全ÿ…...
力扣刷题(数组篇)
日期类 #pragma once#include <iostream> #include <assert.h> using namespace std;class Date { public:// 构造会频繁调用,所以直接放在类里面(类里面的成员函数默认为内联)Date(int year 1, int month 1, int day 1)//构…...
OpenWRT中常说的LuCI是什么——LuCI介绍(一)
我相信每个玩openwrt的小伙伴都或多或少看到过luci这个东西,但luci到底是什么东西,可能还不够清楚,今天就趁机来介绍下,openwrt中的luci,到底是个什么东西。 什么是LuCI? 首先,LuCI是OpenWRT中…...
机器学习核心算法解析
机器学习核心算法解析 机器学习是人工智能的核心技术之一,它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法,包括监督学习、无监督学习和强化学习,并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …...
【目标检测json2txt】label从COCO格式json文件转YOLO格式txt文件
目录 🍀🍀1.COCO格式json文件 🌷🌷2.YOLO格式txt文件 💖💖3.xml2json代码(python) 🐸🐸4.输入输出展示 🙋🙋4.1输入json 🍂🍂4.2输出txt 整理不易,欢迎一键三连!!! 送你们一条美丽的--分割线-- 🍀🍀1.COCO格式json文件 COCO数…...
LVDS接口总结--(5)IDELAY3仿真
仿真参考资料如下: https://zhuanlan.zhihu.com/p/386057087 timescale 1 ns/1 ps module tb_idelay3_ctrl();parameter REF_CLK 2.5 ; // 400MHzparameter DIN_CLK 3.3 ; // 300MHzreg ref_clk ;reg …...
Flink内存配置和优化
在 Apache Flink 1.18 的 Standalone 集群中,内存设置是一个关键配置,它直接影响集群的性能和稳定性。 Flink 的内存配置主要包括 JobManager 和 TaskManager 的内存分配。 以下是如何在 Standalone 模式下配置内存的详细说明。 JobManager 内存配置 Jo…...
网络安全之笔记--Linus命令
Linux命令 文件和目录操作 ls 列出目录内容 常用选项 -a:显示所有文件和目录(包括隐藏文件,以.开头的文件)。 -l:以长格式显示文件和目录的详细信息。 -h:与-l配合使用,以更易读的方式显示文件大…...
deepseek和chatgpt对比
DeepSeek 和 ChatGPT 都是自然语言处理领域的工具,但它们的设计目标和功能有所不同。 功能定位: ChatGPT 是一个基于 OpenAI GPT-3 或 GPT-4 的聊天机器人,旨在进行人机对话、文本生成、问题解答等,广泛应用于教育、客服、创意写作…...
微服务与网关
什么是网关 背景 单体项目中,前端只用访问指定的一个端口8080,就可以得到任何想要的数据 微服务项目中,ip是不断变化的,端口是多个的 解决方案:网关 网关:就是网络的关口,负责请求的路由、转发、身份校验。 前段还是访问之前的端口8080即可 后端对于前端来说是透明的 网…...
Unity中实现动态图集算法
在 Unity 中,动态图集(Dynamic Atlas)是一种在运行时将多个纹理合并成一个大纹理图集的技术,这样可以减少渲染时的纹理切换次数,提高渲染效率。 实现原理: 动态图集的核心思想是在运行时动态地将多个小纹理…...
本地部署DeepSeek Nodejs版
目录 1.下载 Ollama 2.下载DeepSeek模型 3.下载 ollama.js 1.下载 Ollama https://ollama.com/ 下载之后点击安装,等待安装成功后,打开cmd窗口,输入以下指令: ollama -v 如果显示了版本号,则代表已经下载成功了。…...
字节跳动后端二面
📍1. 数据库的事务性质,InnoDB是如何实现的? 数据库事务具有ACID特性,即原子性、一致性、隔离性和持久性。InnoDB通过以下机制实现这些特性: 🚀 实现细节: 原子性:通过undo log实…...
TUSB422 MCU 软件用户指南
文章目录 TUSB422 MCU 软件用户指南 目录表格图表1. 介绍2. 配置2.1 通用配置2.2 USB-PD 3.0 支持2.3 VDM 支持 3. 代码 ROM/RAM 大小优化4. 通过 UART 调试4. 移植到其他微控制器 TUSB422 MCU 软件用户指南 摘要 本文档是 TUSB422 微控制器基于 Type-C 端口控制(…...
Django在终端创建项目(pycharm Windows)
1.选择目录 选择或新建一个文件夹,作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时,django-admin.exe安装的位置,例如 4.运行命令 使用django-admin.exe的绝对路径,在刚才打开的终端…...
wordpress主题制作
工具/原料 <P><BR>使用divcss语言编写的html静态页面一个</P> <P>Macromedia Dreamweaver软件<BR></P> WordPress主题结构分析 1 1、index.php首页模板(最基本) ---- 1、header.php头部 ---- 2、sidebar.php侧边…...
echarts 3d中国地图飞行线
一、3D中国地图 1. 一定要使用 echarts 5.0及以上的版本; 2. echarts 5.0没有内置中国地图了。点击下载 china.json; 3. 一共使用了四层地图。 (1)第一层是中国地图各省细边框和展示南海诸岛; (2)第二层是…...
视频基础操作
1.1. 例子 读取mp4格式的视频,将每一帧改为灰度图,并且打上水印(“WaterMark”),并将其输出保存为out.mp4,在这个例子中可以看到视频读取,每帧数据处理,视频保存的整体流程简单示例 import cv…...
微信小程序 - 组件和样式
组件和样式介绍 在开 Web 网站的时候: 页面的结构由 HTML 进行编写,例如:经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写,例如:经常会采用 .class 、#id 、element 等选择器 但在小程序中不能…...
在本地校验密码或弱口令 (windows)
# 0x00 背景 需求是验证服务器的弱口令,如果通过网络侧校验可能会造成账户锁定风险。在本地校验不会有锁定风险或频率限制。 # 0x01 实践 ## 1 使用 net use 命令 可以通过命令行使用 net use 命令来验证本地账户的密码。打开命令提示符(CMD࿰…...
【Elasticsearch】Elasticsearch检索方式全解析:从基础到实战(二)
接着上一篇文章;我们继续来研究es的复杂检索 文章目录 (1) bool用来做复合查询(2)Filter【结果过滤】(3)term(4)Aggregation(执行聚合) (1) bool用来做复合查询 复合语…...
游戏引擎学习第96天
讨论了优化和速度问题,以便简化调试过程 节目以一个有趣的类比开始,提到就像某些高端餐厅那样,菜单上充满了听起来陌生或不太清楚的描述,需要依靠服务员进一步解释。虽然这听起来有些奇怪,但实际上,它反映…...
(Xshell 8 + Xftp 8)下载安装miniconda至服务器指定目录+配置虚拟环境
一一一一 Xshell 8 Xftp 8均已登录,miniconda.sh安装包已经放在服务器指定目录中 二二二二 赋予脚本执行权限 chmod x Miniconda3-latest-Linux-x86_64.sh安装miniconda ./Miniconda3-latest-Linux-x86_64.sh -p /data1/huyan/zhangyifeng/miniconda3一直Enter…...
多机器人系统的大语言模型:综述
25年2月来自 Drexel 大学的论文“Large Language Models for Multi-Robot Systems: A Survey”。 大语言模型 (LLM) 的快速发展为多机器人系统 (MRS) 开辟新的可能性,从而增强通信、任务规划和人机交互。与传统的单机器人和多智体系统不同,MRS 带来独特…...
通用的将jar制作成docker镜像sh脚本
通用的将jar制作成docker镜像sh脚本 为了在将 JAR 制作成 Docker 镜像的过程中创建日志目录,可以对之前的脚本进行扩展。以下是改进后的脚本,会在镜像构建时在容器内创建日志目录,并将日志文件挂载到该目录下。 在生成的 Dockerfile 中添加…...
Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)
一、QT与PyQT的概念和特点 1.1、QT QT是一个1991年由The Qt Company开发的跨平台C图形用户界面应用程序开发 框架,可构建高性能的桌面、移动及Web应用程序。也可用于开发非GUI程序,比如 控制台工具和服务器。Qt是面向对象的框架,使用特殊的代…...
DeepSeek+3D视觉机器人应用场景、前景和简单设计思路
DeepSeek3D视觉机器人在多个领域具有广泛的应用场景和巨大的前景。以下是详细的分析: 应用场景 制造业 自动化装配:机器人可以精确地抓取和装配零件,提高生产效率和产品质量。 质量检测:通过3D视觉技术检测产品缺陷,确…...
MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32
MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32 1. 获取代码:2. 加入你的项目2.1 以 STM32 为例:2.2 以 ESP-IDF 为例: 3. 对接 API3.1 以 STM32 为例: 4. 更多函数说明5. 写入 EEPROM 示例 MT6835 Framework 纯C语言实现,跨平台&…...
python视频爬虫
文章目录 爬虫的基本步骤一些工具模拟浏览器并监听文件视频爬取易错点一个代码示例参考 爬虫的基本步骤 1.抓包分析,利用浏览器的开发者工具 2.发送请求 3.获取数据 4.解析数据 5.保存数据 一些工具 requests, 用于发送请求,可以通过get,p…...
嵌入式WebRTC压缩至670K,目标将so动态库压缩至500K,.a静态库还可以更小
最近把EasyRTC的效果发布出去给各大IPC厂商体验了一下,直接就用EasyRTC与各个厂商的负责人进行的通话,在通话中,用户就反馈效果确实不错! 这两天有用户要在海思hi3516cv610上使用EasyRTC,工具链是:gcc-2024…...
