求两个正整数的最小公倍数

简介: 求两个正整数的最小公倍数

今天我们来写求解最小公倍数的程序

1.题目描述

牛客网中的题目描述是这样的

题目链接:https://www.nowcoder.com/questionTerminal/d1205615a0904bc39e9e627e7cb9e899

2.题目分析

假设两个正整数a,b;

  • 最小公倍数,最小也是这两个数中的较大的一个

思路

我们可以定义一个变量,变量从这个较大的值开始,看能不能整除这两个数,如果不行,那就+1继续判断,如果不行就继续+1判断,直到可以整除这两个数,则返回最后这个数

3.代码(头脑风暴)

代码1

#include <stdio.h>
int main() {
    long a=0;
    long b=0;
    scanf("%ld %ld",&a,&b);
    long max=a>b?a:b;
    while(max%a!=0||max%b!=0){
        max++;
    }
    printf("%ld",max);
    return 0;
}

顺着这样的逻辑,我们可以写出这样的代码,看似没有问题,但是当遇到非常大的数字的时候,这个算法就显得很复杂,并不能在规定时间内运行,就像这样

究其原因,是因为我们一个一个试数字,这样的方法其实是最耗费时间的;

那有没有更快的算法呢?答案是肯定

代码2

我们假设存在一个数字m,同时能整除a和b;假设m/a=i,m/b=j;

i的取值肯定是从1开始的,假设我们得到一个i值,这个i*a能整除b,那就说明i*a就是最小公倍数

我们发现,在代码1的逻辑中,我们求最小公倍数用了10次循环; 在这个算法中,我们只用了5次循环便找出了最小公倍数,速度提升了很多

那么我们就顺着这个逻辑写我们的代码2

#include <stdio.h>
int main() {
    long a=0;
    long b=0;
    scanf("%ld %ld",&a,&b);
    long i=1;
    while(1){
        if((i*a)%b==0){
            break;
        }
        i++;
    }
    printf("%ld",i*a);
    return 0;
}

这个时候我们发现,代码顺利通过了

可见我们这个逻辑是行得通的,至此,我们的最小公倍数问题就求解成功了

思考:为什么要用long?

我们发现,题目的输入描述范围是1-100000

而int的表示范围有限,我们通过实践发现,用int型并不能很好的实现

4.总结

我们发现,写代码不仅仅是简单的敲敲键盘,更重要的是我们的思维,我们一定要多多练习,锻炼自己的思维能力

一个优秀的程序员肯定是先思考再敲代码的,思维永远走在双手的前面,一起加油吧!小杜陪各位一起成长

相关文章
|
6月前
C练习实例14 - 将一个正整数分解质因数
C练习实例14 - 将一个正整数分解质因数。
72 0
|
2月前
将一个正整数分解质因数
将一个正整数分解质因数。
59 8
|
2月前
|
移动开发 算法
求其最大公约数和最小公倍数
求其最大公约数和最小公倍数。
68 5
|
6月前
55.输入两个正整数m和n,求其最大公约数和最小公倍数
55.输入两个正整数m和n,求其最大公约数和最小公倍数
44 0
|
6月前
L1-025 正整数A+B
L1-025 正整数A+B
43 1
求最小公倍数
求最小公倍数
122 0
欧几里得算法,既辗转相除法。用于计算正整数a,b的最大公约数
欧几里得算法,既辗转相除法。用于计算正整数a,b的最大公约数
108 0
(JAVA编程练习):输入两个正整数m和n,求其最大公约数和最小公倍数。
(JAVA编程练习):输入两个正整数m和n,求其最大公约数和最小公倍数。
(JAVA编程练习):输入两个正整数m和n,求其最大公约数和最小公倍数。