2021:【例4.6】最大公约数

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,表示程序正常结束  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值