[AcWing]872. 最大公约数 (C++实现)最大公约数模板题

  • Post author:
  • Post category:其他




1. 题目

在这里插入图片描述



2. 读题(需要重点注意的东西)

思路:


什么是约数?


约数,又称因数。

整数

a除以

整数

b(b≠0),除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。

求最大公约数的思路(

辗转相除法

,又称

欧几里得算法

):

a和b的最大公约数等于a模b和b的最大公约数,即:


gcd(a,b) = gcd(b,a%b)

证明如下:

在这里插入图片描述



代码思路:


以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数



3. 解法


—————————————————解法—————————————————

#include <iostream>
#include <algorithm>

using namespace std;


int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}


int main()
{
    int n;
    cin >> n;
    while (n -- )
    {
        int a, b;
        scanf("%d%d", &a, &b);
        printf("%d\n", gcd(a, b));
    }

    return 0;
}


可能存在的问题



不理解代码

return b ? gcd(b, a % b) : a;



首先要知道

a ? b : c

是一个三元运算符,如果

a

中的条件成立,则返回

b

,否则返回

c



因此在上述代码中,如果a%b为0了,则返回此时的除数b,否则一直进行辗转相除将a模上一个b。



4. 可能有帮助的前置习题



5. 所用到的数据结构与算法思想



6. 总结

求最大公因数的模板题,理解公式并背下代码。



版权声明:本文为weixin_43972154原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。