最大公约数和最小公倍数
1. 最大公约数*
描述
如果有一个自然数 a 能被自然数 b 整除,则称 a 为 b 的倍数, b 为 a 的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
输入 a 和 b , 请返回 a 和 b 的最大公约数。
数据范围:
1
≤
a
,
b
≤
1
0
9
1 \leq a,b \leq 10^{9}
1≤a,b≤109
进阶:空间复杂度
O
(
1
)
O(1)
O(1),时间复杂度
O
(
l
o
g
n
)
O(logn)
O(logn)
知识点:基础数学
示例1
输入:3, 6
返回值:3
示例2
输入:8, 12
返回值:4
public int gcd (int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
2. 最大的最小公倍数与最大公约数的差*
描述
找出两个数a、b(
1
≤
a
,
b
≤
n
1 \leq a,b \leq n
1≤a,b≤n),且
l
c
m
(
a
,
b
)
−
g
c
d
(
a
,
b
)
lcm(a,b)-gcd(a,b)
lcm(a,b)−gcd(a,b)尽量大。输出最大的
l
c
m
(
a
,
b
)
−
g
c
d
(
a
,
b
)
lcm(a,b)-gcd(a,b)
lcm(a,b)−gcd(a,b)。
其中
l
c
m
(
a
,
b
)
lcm(a,b)
lcm(a,b)表示a和b的最小公倍数,
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)表示a和b的最大公约数。
输入描述: 一行一个数字。
输出描述:一行一个数字表示最大的。
知识点:数学基础
示例1
输入:5
返回值:19
示例2
输入:3
返回值:5
思路:若要返回最大的差值,选取极端的情况:相邻的两个数的 l c m ( a , b ) − g c d ( a , b ) lcm(a,b)-gcd(a,b) lcm(a,b)−gcd(a,b)最大。根据示例,选取a和a-1这两个数,来求取最大差值。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long a = in.nextLong();
long b = a - 1;
// 取一个极端的情况(因为差要尽量大,所以取相邻两个数的最小公倍数与最大公约数的差)
System.out.println(a * b - 1);
}
}
3.最小公倍数**
描述
正整数A和正整数B 的最小公倍数是指能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
数据范围:1≤a,b≤100000
输入描述:输入两个正整数A和B。
输出描述:输出A和B的最小公倍数。
知识点:递归,基础数学
示例1
输入:5 7
返回值:35
示例2
输入:2 4
返回值:4
思路:定义a,b的最大公约数为 g c d ( a , b ) gcd(a,b) gcd(a,b),最小公倍数为 l c m ( a , b ) lcm(a,b) lcm(a,b),即有 g c d ( a , b ) ∗ l c m ( a , b ) = a ∗ b gcd(a,b)*lcm(a,b)=a*b gcd(a,b)∗lcm(a,b)=a∗b。
最大公约数 g c d ( a , b ) gcd(a,b) gcd(a,b)的计算是根据Euclidean algorithm来的,以求取a=1071和b=462的最大公约数为例,具体过程步骤如下:
step1:1071/462 = 2 余147
step2:462/147 = 3 余 21
step3:147/21 = 7 余0
此时,余数为0,所以1071和462的最大公约数为 21。
递归公式 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b),边界条件 i f ( b = = 0 ) , g c d ( a , b ) = a if(b==0) ,gcd(a,b)= a if(b==0),gcd(a,b)=a
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) {
String[] array = line.split(" ");
int a = Integer.parseInt(array[0]);
int b = Integer.parseInt(array[1]);
int lcm = a * b / gcd(a, b);
System.out.println(lcm);
}
}
public static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
}