题解 | #小乐乐与欧几里得#

小乐乐与欧几里得

https://www.nowcoder.com/practice/da13e0cf321e4df9acd0fdf0a433cbb0

#include <stdio.h>
long long test1(long long a, long long b)    //使用迭代方法实现欧几里得算法求最大公约数
{
    if (a == 0 || b == 0)
    {
        return 0;
    }
    long long r = a % b;
    while (r != 0)
    {
        a = b;
        b = r;
        r = a % b;
    }
    return b;
}
long long test2(long long a, long long b)    //使用递归方法实现欧几里得算法求最大公约数
{
    if (a == 0 || b == 0)
    {
        return 0;
    }
    else if (a % b == 0)
        return b;
    else
    {
        long long r = a % b;
        return test2(b, r);
    }
}
int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    long long result1 = test2(a, b);
    long long result2 = a / result1 * b / result1 * result1;        //不要为了这部分性能而影响代码可读性
    printf("%ld", result1 + result2);
}

1.显然不可能暴力解,10^8级数据肯定会爆炸

2.考虑到两个十亿以内的数的最小公倍数可能会很大,所以选择long long,2^63估算上限在10^18数量级,不会溢出

3.辗转相除法/欧几里得算法求最大公约数的原理:https://www.bilibili.com/video/BV1my4y1z7Zn/?spm_id_from=333.337.search-card.all.click&vd_source=441d2aa2c4bb2a4eccbf0d3f0f77398d

原理证明的基本思路:证(a,b)的公因数一定是r的公因数,证(b,r)的公因数也一定是a的公因数,所以(a,b)的公因数一定是(b,r)的公因数,(b,r)的公因数也一定是(a,b)的公因数,所以两者的公因数完全相同,所以最大公因数也相同。

4.可以采用递归或者迭代的方法来实现,此外,可以不用考虑a=0或b=0的情况,题目已说明是正整数。但是要了解,输入0会崩溃。

全部评论

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务