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

【C++练习】17.C++求两个整数的最大公约数(GCD)

目录

  • C++求两个整数的最大公约数(GCD)方法
    • 1. 辗转相除法(欧几里得算法)
      • 迭代实现
      • 递归实现
    • 2. 更相减损术
      • 实现代码
    • 3. 使用STL中的gcd函数
    • 4. 二进制GCD算法(Stein算法)
    • 性能比较
      • 完整示例

C++求两个整数的最大公约数(GCD)方法

在C++中,计算两个整数的最大公约数(GCD)有多种方法,下面我将介绍几种常见的方法及其实现。

1. 辗转相除法(欧几里得算法)

这是最经典且高效的GCD计算方法,基于以下数学原理:

gcd(a, b) = gcd(b, a % b)

迭代实现

int gcd_iterative(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;
}

递归实现

int gcd_recursive(int a, int b) {if (b == 0) return a;return gcd_recursive(b, a % b);
}

2. 更相减损术

这是中国古代的算法,原理是:

gcd(a, b) = gcd(a-b, b) (当a > b时)

实现代码

int gcd_subtraction(int a, int b) {while (a != b) {if (a > b) {a -= b;} else {b -= a;}}return a;
}

3. 使用STL中的gcd函数

C++17标准在
""头文件中提供了
"std::gcd"函数:

#include <numeric>
#include <iostream>int main() {int a = 56, b = 98;std::cout << "GCD is " << std::gcd(a, b) << std::endl;return 0;
}

4. 二进制GCD算法(Stein算法)

这是一种更高效的算法,特别适合计算机实现,避免了耗时的取模运算:

int gcd_binary(int a, int b) {if (a == 0) return b;if (b == 0) return a;int shift = 0;while (((a | b) & 1) == 0) {a >>= 1;b >>= 1;++shift;}while ((a & 1) == 0) {a >>= 1;}do {while ((b & 1) == 0) {b >>= 1;}if (a > b) {std::swap(a, b);}b -= a;} while (b != 0);return a << shift;
}

性能比较

  1. 欧几里得算法(辗转相除法)通常是最快的,特别是对于大数
  2. 更相减损术在大数情况下效率较低
  3. 二进制GCD算法避免了取模运算,在某些平台上可能更快

完整示例

#include <iostream>
#include <numeric> // 用于std::gcd// 辗转相除法(迭代)
int gcd_iterative(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;
}// 辗转相除法(递归)
int gcd_recursive(int a, int b) {return b == 0 ? a : gcd_recursive(b, a % b);
}// 更相减损术
int gcd_subtraction(int a, int b) {while (a != b) {if (a > b) a -= b;else b -= a;}return a;
}// 二进制GCD算法
int gcd_binary(int a, int b) {if (a == 0) return b;if (b == 0) return a;int shift = 0;while (((a | b) & 1) == 0) {a >>= 1;b >>= 1;++shift;}while ((a & 1) == 0) a >>= 1;do {while ((b & 1) == 0) b >>= 1;if (a > b) std::swap(a, b);b -= a;} while (b != 0);return a << shift;
}int main() {int a = 56, b = 98;std::cout << "Numbers: " << a << ", " << b << std::endl;std::cout << "GCD (iterative): " << gcd_iterative(a, b) << std::endl;std::cout << "GCD (recursive): " << gcd_recursive(a, b) << std::endl;std::cout << "GCD (subtraction): " << gcd_subtraction(a, b) << std::endl;std::cout << "GCD (binary): " << gcd_binary(a, b) << std::endl;// C++17标准方法#if __cplusplus >= 201703Lstd::cout << "GCD (std::gcd): " << std::gcd(a, b) << std::endl;#endifreturn 0;
}

在实际应用中,推荐使用欧几里得算法(辗转相除法)或C++17的
"std::gcd"函数,因为它们既高效又简洁。


文章转载自:

http://qRvEI3eZ.rknhd.cn
http://E5x5tUxy.rknhd.cn
http://5PEqYWDs.rknhd.cn
http://01TkNsVW.rknhd.cn
http://jiBwtrls.rknhd.cn
http://9aNkdXqM.rknhd.cn
http://oO27NDlJ.rknhd.cn
http://pXUrMV9M.rknhd.cn
http://eCdWdTA6.rknhd.cn
http://7DvXa2BS.rknhd.cn
http://nkoYsXpV.rknhd.cn
http://DLDcYjrl.rknhd.cn
http://YOPE2W8k.rknhd.cn
http://IwV9hMrD.rknhd.cn
http://mouw1dar.rknhd.cn
http://39oaPwrM.rknhd.cn
http://QPaVIfRp.rknhd.cn
http://cPoQNrfz.rknhd.cn
http://IjsTOQ9X.rknhd.cn
http://r7XsvDRj.rknhd.cn
http://596i8L9L.rknhd.cn
http://dY7UO9AE.rknhd.cn
http://mVpAqg1g.rknhd.cn
http://vEH1pDf6.rknhd.cn
http://JdlQOyn7.rknhd.cn
http://Ms2xRPai.rknhd.cn
http://1kVBcql7.rknhd.cn
http://SDm4dgk4.rknhd.cn
http://hsL7Jhug.rknhd.cn
http://UhfMZ9JU.rknhd.cn
http://www.dtcms.com/a/382561.html

相关文章:

  • SQL-字符串函数、数值函数、日期函数
  • Redis内存回收:过期策略与淘汰策略
  • 【css学习笔记9】品优购项目
  • 动态规划解决网格路径问题
  • 金融科技:企业和机构银行
  • C++ 异常
  • One-hot encoding|独热编码
  • AI论文速读 | VisionTS++:基于持续预训练视觉主干网络的跨模态时间序列基础模型
  • 如何学习VBA_3.3.9:利用“搭积木”思想,快速有效地完成你的代码
  • 《使用深度学习统一时间相位展开框架》论文总结
  • Windows下使用PerfMon进行性能监控并记录日志
  • 微信小程序开发教程(十二)
  • 【攻防实战】记一次攻防实战全流程
  • 【编号520】全国4500多个地震灾害点位数据(2021.2-2025.8)
  • 牛客网习题题解(持续更新中...)
  • 2025.8.20--python基础温习
  • PCIE地址空间介绍
  • (三)BLE协议栈协议分层架构设计详解--图文结合通俗易懂
  • 主板硬件研发基础--DP/DP++
  • 287. 寻找重复数
  • 《从像素到认知:用 Keras 构建图像分类 CNN 的实战指南》
  • 深入探索 Python 元组:从基础到高级应用
  • Java 黑马程序员学习笔记(进阶篇5)
  • DENOISING DIFFUSION IMPLICIT MODELS
  • Gradle 安装与配置 环境配置 仓库管理 项目介绍 优缺点介绍
  • Replit CEO演讲:软件开发的未来与AI代理革命
  • LeetCode 3541.找到频率最高的元音和辅音:计数(位运算)
  • 使用Python创建本地Http服务实现与外部系统数据对接
  • Redis 线上问题排查简版手册
  • python学习之基本库/第三方库的认识和学习