最大公约数和最小公倍数
辗转相除法
辗转相除法(也称欧几里德算法)是一种用于计算两个整数的最大公约数(Greatest Common Divisor, GCD)的有效方法。其原理基于以下性质:若 ( a >=b ),则 gcd(a,b)=gcd(b,a mod b)。这意味着可以通过反复将较大数替换为它与较小数的余数来求得最大公约数。
原理解析:
-
基本性质:若 ( b = 0 ),则gcd(a,0)=a,即任意整数与0的最大公约数为其自身。
-
递归过程:对于任意两个整数 ( a ) 和 ( b ),若 a>=b,则计算 ( a mod b ),并递归调用以 ( b ) 和 ( a mod b ) 为参数的函数,直至 ( b ) 变为0,返回此时的 ( a )。
以下是使用迭代法实现辗转相除法的 C++ 代码
#include <iostream>
// 函数计算最大公约数,使用辗转相除法
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main() {
int a, b;
std::cout << "输入两个整数:";
std::cin >> a >> b;
int result = gcd(a, b);
std::cout << "它们的最大公约数是:" << result << std::endl;
return 0;
}
以下是使用递归实现辗转相除法的 C++ 代码,并附带一个示例:
#include <iostream>
// 递归函数计算最大公约数,使用辗转相除法
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
int main() {
int a, b;
std::cout << "输入两个整数:";
std::cin >> a >> b;
int result = gcd(a, b);
std::cout << "它们的最大公约数是:" << result << std::endl;
return 0;
}
代码说明:
gcd
函数使用递归方式实现了辗转相除法。- 如果
b
等于0,直接返回a
,即递归的终止条件。 - 否则,递归调用
gcd
函数,传入b
和a % b
作为参数,直至b
变为0为止。 main
函数与之前的示例相同,接受用户输入的两个整数,并调用gcd
函数计算它们的最大公约数,然后输出结果。
示例:
假设用户输入的两个整数是 48 和 18。
-
第一次调用
gcd(48, 18)
:- 因为
b
不为0,执行递归调用gcd(18, 48 % 18)
,即gcd(18, 12)
。
- 因为
-
第二次调用
gcd(18, 12)
:- 因为
b
不为0,执行递归调用gcd(12, 18 % 12)
,即gcd(12, 6)
。
- 因为
-
第三次调用
gcd(12, 6)
:- 因为
b
不为0,执行递归调用gcd(6, 12 % 6)
,即gcd(6, 0)
。
- 因为
-
第四次调用
gcd(6, 0)
:- 这时
b
等于0,返回a
,即返回6。
- 这时
因此,48 和 18 的最大公约数是6,代码运行结果将输出:
输入两个整数:48 18
它们的最大公约数是:6
这种递归实现方式与迭代方式相比,在思路上更加直观,但可能在处理极端大的数时,可能会面临递归深度的限制。
递归代码的简化
上述递归代码可以从两行简化为一行,代码如下:
int gcd(int x, int y)
{
return y ? gcd(y, x % y) : x;
}
求最小公倍数:
我们都知道:两个整数x,y。它们的乘积 xy=最大公约数最小公倍数,那么我们只需要求出最大公约数,就可以算出最小公倍数。
C++代码如下
int lcm(int x, int y)
{
return x / gcd(x, y) * y;
}