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

小乐乐与欧几里得

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

题目描述:

小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。

输入描述: 每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)

输出描述: 对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。

思路:①暴力求解法;(复杂度过大,编译器无法通过)②辗转相除法(优化的方法OK的)!

#include <stdio.h>
//法一:无法通过,会出现算法复杂度过大的情况!--暴力求解不太行
/*
int main()
{
    long long n,m;
    scanf("%lld %lld",&n,&m);
    //求最大公约数
    long long max = n>m?m:n;//假设n和m的较小值为最大公约数
    while( 1 )
    {
        if( n%max==0 && m%max==0)
        {
            break;
        }
        max--;
    }//此时max里面记录的就是最大公约数
    //最小公倍数
    long long min = n>m?n:m; //假设n和m的较大值为最小公倍数
    while(1)
    {
        if( min%n==0 && min%m==0 )
        {
            break;
        }
        min++;
    }
    printf("%lld",min+max);
    return 0;
}
*/

//重新优化后的算法
int main()
{
    long long n,m;
    scanf("%lld %lld",&n,&m);
    //求最大公约数
    long long max = 0;
    long long min = 0;
    long long tmp = 0;
    //先将n和m进行保存,防止下面使用辗转相除的方法影响n和m的值
    long long a = n;
    long long b = m;
    
    //辗转相除法
    while(tmp=n%m)
    {
        n = m;
        m = tmp;
    }
    max = m;
    //最小公倍数=n*m/max
    min = a*b/max;
    printf("%lld",min+max);
    return 0;
}
全部评论
优化后的算法没太看懂,有好心人解释一下吗/(ㄒoㄒ)/~~
点赞 回复 分享
发布于 2024-08-08 22:38 广东
min与max写反了
点赞 回复 分享
发布于 2024-06-19 22:04 陕西
没问题了,手算模拟了一下
点赞 回复 分享
发布于 2024-02-04 19:30 河南
我有个问题,在while条件判断前不应该比较n和m谁更大吗
点赞 回复 分享
发布于 2024-02-04 19:28 河南
谢谢兄弟,解答了我通过不了的疑惑
点赞 回复 分享
发布于 2023-10-24 11:45 山西
厉害,等到余数为0了会自己跳出循环,所以都不用设置break
点赞 回复 分享
发布于 2023-08-31 11:12 湖南
这个厉害啊
点赞 回复 分享
发布于 2023-08-10 11:13 山东
感谢
点赞 回复 分享
发布于 2022-09-15 20:15 江苏
感谢
点赞 回复 分享
发布于 2022-03-03 20:55

相关推荐

用微笑面对困难:只要你保证项目和获奖都是真的就行尤其是“对战,总负责人”啊这些套职,基本上队员,打杂的都这么写
点赞 评论 收藏
分享
评论
47
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务