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);

MN 是模板参数,表示输入的两个整数类型。
返回值是 std::common_type_t<M, N>,即两个输入类型 MN 的公共类型。例如,如果输入是 intlong,返回值类型将是 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),这是一种高效的计算最大公约数的方法。其基本思想是:
对于两个正整数 ab(假设 a > b),ab 的最大公约数等于 ba % 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::gcdconstexpr 函数,它可以在编译时计算结果。这意味着在运行时可以直接使用计算好的结果,从而提高程序的运行效率。

四、实际应用场景

(一)分数化简

在处理分数时,常常需要将分数化简为最简形式。最大公约数是化简分数的关键。例如,将分数 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMA软件评测机构测量不确定度评定具体怎么做?

测量不确定度作为测量结果的一部分&#xff0c;是评价测量活动质量的重要指标&#xff0c;也是CMA软件评测机构衡量检测结果准确性和可靠性的重要参数。本文为您介绍CMA软件评测机构测量不确定度评定具体应该怎么做。 在申请CMA资质时&#xff0c;软件评测机构需要制定《测量不…

vue项目网页图标修改

参考:https://blog.csdn.net/qq_53911056/article/details/144744699 在Vue项目中修改网页图标&#xff08;favicon&#xff09;是一个相对简单的过程。以下是详细的步骤&#xff1a; 准备新的图标文件 准备一个新的图标文件&#xff08;通常是 .ico 格式&#xff0c;但也支持其…

资料搜集-内存屏障

0. 引用 内存屏障详解-CSDN博客 为什么需要内存屏障&#xff1f;_mesi 内存屏障-CSDN博客 内存屏障与CPU优化&#xff1a;理解多核系统中的数据一致性-CSDN博客 内存屏障今生之Store Buffer, Invalid Queue_storebuffer-CSDN博客 内存屏障&#xff08;Memory Barrier&…

【Java八股文】01-Java基础面试篇

【Java八股文】01-Java基础面试篇 概念Java特点Java为什么跨平台JVM、JDK、JRE关系 面向对象什么是面向对象&#xff0c;什么是封装继承多态&#xff1f;多态体现的方面面向对象设计原则重载重写的区别抽象类和实体类区别Java抽象类和接口的区别抽象类可以被实例化吗 深拷贝浅拷…

线程池-抢票系统性能优化

文章目录 引言-购票系统线程池购票系统-线程池优化 池化 vs 未池化 引言-购票系统 public class App implements Runnable {private static int tickets 100;private static int users 10000;private final ReentrantLock lock new ReentrantLock(true);public void run() …

Python解决“数字字符串千分位转化”问题

Python解决“数字字符串千分位转化”问题 问题样例 解决代码 问题 A在工作时遇到了一个问题&#xff0c;他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式&#xff0c;并且保留小数部分。A还发现&#xff0c;有时候输入的数字字符串前面会有无用的 0&am…

【多模态大模型】系列1:Transformer Encoder——ViLT、ALBEF、VLMO

目录 1 ViLT2 ALBEF3 VLMO 1 ViLT ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision 图文多模态任务&#xff0c;关键是提取视觉特征和文本特征&#xff0c;然后对齐。在之前的多模态研究工作中&#xff0c;视觉侧通常需要一个目标检测器来…

【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第二节】

ISO 14229-1:2023 UDS诊断服务测试用例全解析&#xff08;ECU复位0x11服务&#xff09; 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025-02-12 关键词&#xff1a;UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 二、ECU复位服务&#xff08;0x11服务&…

关于AutoTokenizer.from_pretrained-----deepseek的回答

AutoTokenizer.from_pretrained 是 Hugging Face 的 transformers 库中的一个方法&#xff0c;用于加载预训练的 tokenizer。Tokenizer 是自然语言处理&#xff08;NLP&#xff09;中的一个重要组件&#xff0c;负责将文本转换为模型可以理解的数字形式&#xff08;如 token ID…

百度 API 教程 001:显示地图并添加控件

目录 01、基本使用 前期准备 显示地图 开启鼠标滚轮缩放地图 02、添加地图控件 添加标准地图控件 添加多个控件 网址&#xff1a;地图 JS API | 百度地图API SDK 01、基本使用 前期准备 注册百度账号 申请成为开发者 获取密钥&#xff1a;控制台 | 百度地图开放平台…

c语言判断一个文件的文件格式

在 Linux 下使用 C 语言判断一个文件的文件格式&#xff0c;通常需要检查文件的头信息&#xff08;也称为“幻数”或“魔数”&#xff09;。不同的文件格式在文件头有特定的字节序列&#xff0c;这些字节序列可以用来确定文件的类型。以下是一个基本的示例&#xff0c;展示了如…

电容器教程摘要

正如我们将在本电容器教程中看到的那样&#xff0c;电容器是能够在其板上存储电荷的能源。因此&#xff0c;电容器由于存储充电的能力而存储能量&#xff0c;理想的电容器不会松散其存储的能量。 电容器的简单结构是使用两个平行的导电金属板通过绝缘材料通过距离分开。这种绝…

【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA data source1: BH coordination tabledata source2:BH layer tableprocess 1:Collect BH List To Layer Tableprocess 2:match Reduced Level from "Layer"+"BH"data source1: BH coordination…

汇编简介常用语法

为什么要有汇编 因为Cortex-A芯片一上电SP指针还没初始化&#xff0c;C环境还没准备 好&#xff0c;所以肯定不能运行C代码&#xff0c;必须先用汇编语言设置好C环境&#xff0c;比如初始化DDR、设置SP 指针等等&#xff0c;当汇编把C环境设置好了以后才可以运行C代码 GNU语法…

内网ip网段记录

1.介绍 常见的内网IP段有&#xff1a; A类&#xff1a; 10.0.0.0/8 大型企业内部网络&#xff08;如 AWS、阿里云&#xff09; 10.0.0.0 - 10.255.255.255 B类&#xff1a;172.16.0.0/12 中型企业、学校 172.16.0.0 - 172.31.255.255 C类&#xff1a;192.168.0.0/16 家庭…

深入了解 MySQL:从基础到高级特性

引言 在当今数字化时代&#xff0c;数据的存储和管理至关重要。MySQL 作为一款广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;凭借其高性能、可靠性和易用性&#xff0c;成为众多开发者和企业的首选。本文将详细介绍 MySQL 的基础概念、安装启…

2025年中国AI大模型综合排名及分析

&#xff08;基于2025年1月-2月多机构测评数据整合&#xff09; 一、综合排名与核心能力对比 根据SuperCLUE、艾媒咨询等机构最新评测数据&#xff08;截至2025年2月&#xff09;&#xff0c;中国主流AI大模型在综合性能、垂直场景适配性、成本效率等维度表现如下&#xff…

【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第三节】

ISO 14229-1:2023 UDS诊断服务测试用例全解析&#xff08;安全访问0x27服务&#xff09; 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025-02-12 关键词&#xff1a;UDS安全访问、0x27服务、ISO 14229-1:2023、ECU安全验证 一、服务概述 安全访问服务&#xff0…

深度剖析观察者模式:从理论到实战的Java实现

在软件设计中&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09; 是一种高频使用的行为型设计模式&#xff0c;它定义了对象之间一对多的依赖关系&#xff0c;使得当一个对象状态改变时&#xff0c;其所有依赖对象&#xff08;观察者&#xff09;会自动收到通知并…