学习指引
- 序、专栏前言
- 序、本章前言
- 一、求lca的两种方法
- 1)、暴力求解法
- 1、模板代码
- 2)、公式法
- 1、模板代码
- 二、【例题1】
- 2、解题思路
- 3、模板代码
- 三、【例题2】
- 2、解题思路
- 3、模板代码
- 四、推荐专栏
- 六、课后习题
序、专栏前言
本专栏开启,目的在于帮助大家更好的掌握学习Java
,特别是一些Java学习者
难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
序、本章前言
既然学会了最大公约数,那么求最小公倍数我们也一定得会。如果掌握了前者,那么后者对我们而言则是砍瓜切菜。今天我们通过三个方法帮助大家掌握求最小公倍数。而此类问题我们也称之为lca
,类似求最大公约数叫做gcd
一样。
一、求lca的两种方法
lca
是指的是最小公倍数。它指的是两个或多个整数公有的倍数叫做它们的公倍数,而其中除去0
符合条件最小的公倍数我们称之为最小公倍数
。下面我们都以两个整数a
和b
为试例求解。
1)、暴力求解法
假设a
和b
的最小公倍数是c
。那么我们必然能找到两个整数x
和y
,满足以下等式
如果假设a
大于b
,那么一定可得x
小于y
,反之亦然。所以我们可以对x
进行枚举,当首次满足条件
由此我们可以对x
进行枚举,当符合条件时,ax
就是我们的最小公倍数。为什么不枚举y
呢?因为x
比y
小,我们可以更早的找到答案。
1、模板代码
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
int x=1;
while (a*x%b!=0){
x++;
}
System.out.println(a*x);
}
}
2)、公式法
求两数a
和b
的最小公倍数,其实是有一个公式的,这公式还涉及到它们的最大公因数。假设a
和b
的最小公倍数是c
,最大公因数是d
。存在一个等式:两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即有下式
转换过来可知:
根据上章学习过gcd
函数,我们可知:
最终可得:
由此我们发现,lcm
函数的实现,只需要基于gcd
实现即可。这也是我们常用方法。
1、模板代码
static int gcd(int a,int b){
return b == 0 ? a:gcd(b,a%b);
}
static int lcm(int a, int b){
return a/gcd(a,b)*b;//最小公倍数=两数之积÷两数最大公约数
}
注意lcm
函数内是先除法再乘法,防止先乘法时ab
太大产生爆int
的情况。
二、【例题1】
给定多组测试数据,每次给定两个整数,请你打印出它们的最小公倍数
。
2、解题思路
题目难度:⭐️
写出gcd
函数模板和lcm
模板,直接套用即可。
3、模板代码
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
int a=sc.nextInt();
int b=sc.nextInt();
System.out.println(lcm(a,b));
}
}
static int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
static int lcm(int a,int b){
return a/gcd(a,b)*b;
}
}
直接套用
lcm
模板,注意先除再乘。
三、【例题2】
给定一个整数t
,然后输入t
个整数,请你打印出它们的最小公倍数。
2、解题思路
题目难度:⭐️
写出gcd
函数模板和lcm
模板,求多个数的最小公倍数类似于求多个数的最大公约数。
3、模板代码
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
int a=sc.nextInt();
int b=sc.nextInt();
int g=lcm(a,b);
for (int i = 2; i <t; i++) {
int c=sc.nextInt();
g=lcm(c,g);
}
System.out.println(g);
}
static int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
static int lcm(int a,int b){
return a/gcd(a,b)*b;
}
}