C语言经典题目——最大公因数和最小公倍数

  • 在学习C语言的过程中,会遇到很多很经典的代码,
  • 今天给大家分享我在刷题过程中遇到的经典题目,
  • 注:以下题目均来自牛客网
  • 如果你是刚入门C语言又找不到题库练手感的,
  • 我非常推荐你去牛客网刷题

1.小乐乐和欧几里得

1.1 描述

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

1.2 输入描述

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

1.3 输出描述

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

1.4示例

在这里插入图片描述

1.5 思路

  • 根据题目要求就是计算两个数的最大公约数和最小公倍数的和
  • 那我们可以先分别计算出最大公约数和最小公倍数,再将两数相加即可
  • 最大公约数,首先想到的就是遍历从2到两个数中较小数,然后用两个数逐除,看能不能除尽,
  • 最小公倍数,也是从最大数开始一直往后遍历,知道这个数能同时被两数除尽
  • 代码如下
#include <stdio.h>
int main()
{
    long long n,m;	//考虑到这里的n和m可能很大,所以使用long long来定义
    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;
}
  • 这种暴力求解的思路只在两数比较小的时候好用,但是当两个数都很大的时候,算法的复杂度就很大了
  • 很不巧,当你使用这个方法的时候,这里过不了检测

在这里插入图片描述

  • 既然暴力解法不行,那就只能借助古人的智慧了——>辗转相除法求最大公因数
  • 具体做法如下,可参考辗转相除法

在这里插入图片描述

  • 最大公因数求出来了,那么最小公倍数就是两数相乘之后再除最大公因数即可
  • 具体代码实现如下:
#include <stdio.h>
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;
}
  • 这样就完成这道题目了

在这里插入图片描述

  • 这道题目虽然是属于简单题,但是通过率却很低,

在这里插入图片描述

  • 可见这道题难度还是有的。

最后,
如果上述代码或表述有问题,
欢迎一起交流

  • 37
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看落日的YT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值