2021:【例4.6】最大公约数
时间限制: 1000 ms 内存限制: 65536 KB
提交数:68610 通过数: 44426
【题目描述】
求两个正整数m,n的最大公约数。
【输入】
输入m,n。
【输出】
m,n的最大公约数。
【输入样例】
4 6
【输出样例】
2
【提示】
【数据范围】
对于全部数据:m,n<4000000。
解题思路分析:
我们明确题目要求:求出两个正整数m和n的最大公约数。最大公约数,简称GCD,是两个或多个整数共有约数中最大的一个。
对于此题,我们采用辗转相除法(又称欧几里得算法)来求解最大公约数。这是一种非常经典的算法,其原理基于这样一个事实:两个整数的最大公约数与其中较小的那个数和两数的差(大数减小数)的最大公约数相等。即gcd(a, b) = gcd(b, a mod b)。
代码中,我们首先定义了三个整型变量m、n和r,用于存储输入的两个数以及它们的余数。接着,我们读入m和n的值。
我们计算m除以n的余数r。如果r不为0,说明n不是m的约数,我们需要继续计算。此时,我们将n的值赋给m,将r的值赋给n,然后再次计算m除以n的余数r。这个过程会一直循环,直到r为0为止。
当r为0时,说明我们找到了m和n的最大公约数,它就是此时的n的值。最后,我们输出这个最大公约数。
此算法的时间复杂度是O(log(min(m, n))),非常高效,适用于求解大规模数据的最大公约数问题。
示例代码
#include<bits/stdc++.h> // 包含标准C++库中的所有头文件
using namespace std; // 使用标准命名空间,这样就不需要反复写std::前缀
int main() // 主函数入口
{
int m, n, r; // 定义三个整型变量m, n, r,分别用于存储两个输入的正整数和它们的余数
cin >> m >> n; // 从标准输入读取两个正整数m和n
r = m % n; // 计算m除以n的余数,并将结果存储在r中
// 当余数r不为0时,继续循环
while (r != 0)
{
m = n; // 将n的值赋给m,用于下一次迭代中的除数
n = r; // 将r的值赋给n,用于下一次迭代中的被除数
r = m % n; // 再次计算m除以n的余数,更新r的值
}
cout << n << endl; // 当r为0时,输出此时的n值,即为m和n的最大公约数
return 0; // 主函数返回0,表示程序正常结束
}