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

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

1.欧几里得算法原理

数学原理:

                                      GCD(a,b) = GCD(b,a mod b)

其中,

  •  a 和 b 是两个正整数
  • a mod b 是 a 除以 b 的余数

原理为:两个数的最大公约数等于其中较小的数和两数相除余数的最大公约数

 


2.欧几里得算法步骤

具体步骤:

  1. 比较两个数 a 和 b ,假设 a  >  b
  2. 计算 a 除以 b 的余数 r = a mod b.
  3. 如果 r = 0,则 b 就是 a 和 b 的最大公约数。
  4. 如果 r != 0,则 将 b 赋值给 a,将 r 赋值给 b ,然后重复步骤 2 和 3 。

3.举例 

假设我们要求GCD(48,18):

  1. 48 mod 18 等价于 48 % 18 = 12 (两者余数为12).
  2. 按照上面提到的步骤,现在计算GCD(18,12)。也就是求18 mod 12(18 % 12 = 6)
  3. 现在计算GCD(12,6).12 mod 6 = 0;
  4.  余数变成了0,所以GCD(48,18) = 6

4.实现代码

c++代码实现:

#include <iostream>
using namespace std;

// 计算两个数的最大公约数(非递归)
int gcd(int a, int b) {
    int r;
    while (b != 0) {
        r = a % b; // 计算余数
        a = b;         // 将 b 赋值给 a
        b = r;         // 将余数赋值给 b
    }
    return a; // 当 b 为 0 时,a 就是 GCD
}

// 递归计算两个数的最大公约数
int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

//上面两种都可以

int main() {
    int a, b;
    cin >> a >> b;
    int result = gcd(a, b);
    cout << "它们的最大公约数是: " << result << endl;
    return 0;
}

 5.直接使用函数

在c++中有一个函数__gcd(),直接计算两个数的最大公约数。这个函数定义在<algorithm>头文件中  (c++17版本以上可以使用(一般的做题平台都可以))

#include <iostream>
#include <algorithm> // 包含 __gcd() 函数的头文件
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    int result = __gcd(a, b); // 使用 __gcd() 函数
    cout << "它们的最大公约数是: " << result << endl;
    return 0;
}


http://www.kler.cn/a/558946.html

相关文章:

  • transformer架构嵌入层位置编码之RoPE旋转位置编码及简单实现示例
  • go-zero学习笔记(五)
  • Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法
  • 嵌入式之内存管理
  • 【2025.2最新版】从零开始的HTML网页开发学习笔记(包含网页基础概念 HTML语法 前端工具VsCode介绍)
  • mysql之B+ 树索引 (InnoDB 存储引擎)机制
  • 反射和注解
  • 自制操作系统前置知识汇编学习
  • 实验-安装Proteus
  • ZLMediaKi集群设置
  • 简说spring 的设计模式
  • Python项目源码33:待办事项列表应用2.0(命令行界面+Json+类)
  • Java基础常见的面试题(易错!!)
  • QT闲记-状态栏,模态对话框,非模态对话框
  • 485. 最大连续 1 的个数
  • 【CI/CD】Jenkinsfile管理+参数化构建+邮件通知以及Jenkins + SonarQube 代码审查
  • 【数据库维护】如何解决Clickhouse数据库Too many parts报错
  • 当“欲望号街车”遇阻:解锁自由的疯狂选择题
  • 【C语言】指针(5)
  • 回合制文字版格斗游戏(类的运用)