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

小乐乐与欧几里得

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

当我第一次看到这道题的时候,感觉并不是特别难,首先映入脑海的便是暴力解法:
// #include <stdio.h>
// int main()
// {
//     int n = 0, m = 0;
//     int maxDiv = 0, minMul = 0;
//     scanf("%d %d", &n, &m);
//     //最大公约数
//     int max = n > m ? n : m;
//     int min = n < m ? n : m;
//     int i = 0;
//     for(i = min; i >= 0; i --)
//     {
//         if(max % i == 0 && min % i == 0)
//         {
//             maxDiv = i;
//             break;
//         }
//     }
//     int tmp = max;
//     while(1){
//         if(tmp % max == 0 && tmp % min == 0){
//             minMul = tmp;
//             break;
//         }
//         tmp ++;
//     }
//     printf("%d", maxDiv + minMul);
//     return 0;
// }

``` js
之后我有自信满满地点了测试示例,成功解了出来,可是提交了之后才发现算法过于复杂了,然后
便转向评论区地da lao讨教,又去度娘哪里找到了欧几里得公式,不得不佩服这位数学家地思维逻辑,
并且发现之前的int类型是不够用的,特意换上了long类型,终于过去了哈~:
#include <stdio.h>
//欧几里得算法思想示例:
// 1997 / 615 = 3 (余 152)
// 615 / 152 = 4(余7)
// 152 / 7 = 21(余5)
// 7 / 5 = 1 (余2)
// 5 / 2 = 2 (余1)
// 2 / 1 = 2 (余0)
// 至此,最大公约数为1
//最小公倍数等于两数之积除以其最大公约数
int main()
{
    long n = 0, m = 0;
    scanf("%d %d", &n, &m);
    long maxNum = n > m ? n : m;
    long minNum = n < m ? n : m;
    long remainder = -1;
    long maxDiv = -1;
    while(1)
    {
        remainder = maxNum % minNum;
        if(remainder == 0)
        {
            maxDiv = minNum;
            break;
        }
        maxNum = minNum;
        minNum = remainder;
    }
    long minMul = n * m / maxDiv;
    printf("%ld",maxDiv + minMul);
    return 0;
}

``` js
全部评论

相关推荐

牛客279957775号:铁暗恋
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务