1、欧几里得算法的用途
用来计算两个整数的最大公约数
2、什么是欧几里得算法
1、基本原理:
对于两个整数 a 和 b(假设 a >= b),它们的最大公约数等于 b 和 a%b(a 除以 b 的余数)的最大公约数(终止条件:0和任意数a的最大公约数是a)
其实在代码中无需判断a和b的大小
eg1:a>=b
- 初始时,设 a = 48,b = 18。
- 第一步:48 % 18 = 12。此时,更新 a = 18, b = 12。
- 第二步:18 % 12 = 6。此时,更新 a = 12, b = 6。
- 第三步:12 % 6 = 0。此时,b 变为 0,所以最大公约数为 a = 6。
在这个例子中,初始时 a = 48 大于 b = 18
eg2:a<b
假设我们要计算 18 和 48 的最大公约数(反过来):
- 初始时,设 a = 18,b = 48。
- 第一步:18 % 48 = 18。此时,更新 a = 48, b = 18。
- 第二步:48 % 18 = 12。此时,更新 a = 18, b = 12。
- 第三步:18 % 12 = 6。此时,更新 a = 12, b = 6。
- 第四步: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))
似乎是递归深度,(我理解不够,欢迎评论)