欧几里得算法

1、欧几里得算法的用途

        用来计算两个整数的最大公约数

2、什么是欧几里得算法

        1、基本原理

对于两个整数 a 和 b(假设 a >= b),它们的最大公约数等于 b 和 a%b(a 除以 b 的余数)的最大公约数(终止条件:0和任意数a的最大公约数是a)

                其实在代码中无需判断a和b的大小

                eg1:a>=b

  1. 初始时,设 a = 48,b = 18。
  2. 第一步:48 % 18 = 12。此时,更新 a = 18, b = 12。
  3. 第二步:18 % 12 = 6。此时,更新 a = 12, b = 6。
  4. 第三步:12 % 6 = 0。此时,b 变为 0,所以最大公约数为 a = 6。

在这个例子中,初始时 a = 48 大于 b = 18

                eg2:a<b

假设我们要计算 18 和 48 的最大公约数(反过来):

  1. 初始时,设 a = 18,b = 48。
  2. 第一步:18 % 48 = 18。此时,更新 a = 48, b = 18。
  3. 第二步:48 % 18 = 12。此时,更新 a = 18, b = 12。
  4. 第三步:18 % 12 = 6。此时,更新 a = 12, b = 6。
  5. 第四步:12 % 6 = 0。此时,b 变为 0,所以最大公约数为 a = 6。

无论是哪种情况,算法都通过反复取余数的操作,成功求出了 18 和 48 的最大公约数为 6

这个例子清楚地展示了欧几里得算法如何不受 a 和 b 大小关系影响,仍能有效求解最大公约数的问题。

        2、递归或迭代

欧几里得算法可以通过递归或迭代来实现。递归方法是直接应用上述公式,直到其中一个数变为 0,剩下的非零数即为最大公约数。迭代方法则是不断更新两个数的值,直到其中一个为零。

        3、结束条件

当其中一个数变为零时,另一个数即为最大公约数。

3、代码实现

#include<iostream>
using namespace std;
//欧几里得算法
int gcd(int a, int b) {
	return  b == 0 ?a : gcd(b, a % b);
}

int main() {
	int a, b;
	while(cin >> a >> b)
	cout<< gcd(a, b)<<endl;
	return 0;
}

4、时间复杂度

O(log(min(a,b))
似乎是递归深度,(我理解不够,欢迎评论)

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值