问题描述
例:
3 5
例:
例:两个数都小于65536。
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int a = input.nextInt();
int b = input.nextInt();
System.out.println(lcm(a,b));
}
private static int lcm(int a, int b) {
// TODO Auto-generated method stub
int g = gcd(a,b);
return a*b/g;
}
private static int gcd(int a, int b) {
// TODO Auto-generated method stub
if(b == 0)
return a;
else
return gcd(b,a%b);
}
}
思路:最小公倍数LCM(Minimum Common Multiple)=两个数的乘积/最大公约数GCD(Greatest Common Divisor),因此就转化成了求解最大公约数的问题。
LCM(A,B)*GCD(A,B)=A*B
求最大公约数的方法:
(1)欧几里德算法(辗转相除法)
定义:两个正整数A,B的最大公约数等于其中较小值与两数相除的余数的最大公约数。
GCD(A,B)=GCD(B,A%B),A>B
图片来源:https://blog.csdn.net/qq_31828515/article/details/51812154
int gcd(int a, int b) {
if(b == 0)
return a;
else
return gcd(b,a%b);
}
把递归换成循环:
int gcd(int a, int b) {
int r;
while (b != 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
(2)出自《九章算数》的更相减损术(辗转相减法)
更相减损术原本是为了约分而设计的:
可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
1.任意给定两个正整数,判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
2.大数减小数,把差与小数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数,相当于不要第一步。
GCD(A,B)=GCD(B,A-B),A>B
GCD(A,B)=GCD(A,B-A),A<B
图片来源:https://blog.csdn.net/qq_31828515/article/details/51812154
int gcd(int a, int b) {
while(a!=b){
if(a>b)
a = a-b;
else
b = b-a;
}
return a;
}
(3)穷举法
这是最基础的算法,从temp = 2开始逐步累加,依次判断temp值是否可以同时整除a和b,如果可以则将此时的temp赋给gcd,直到循环条件while(temp <= a && temp <= b)不满足时,最后一次循环赋值即为真正的gcd。
int gcd(int a, int b) {
int gcd = 1;
int temp = 2;
while(temp <= a && temp <= b){
if(a%temp == 0 && b%temp == 0)
gcd = temp;
temp++;
}
return gcd;
}
以及Stein算法(遇到再补充)
扩展欧几里德算法用来求解模线性方程(组):
ax+by=gcd(a,b)
参考博客:https://blog.csdn.net/Holmofy/article/details/76401074
作者写的特别详细系统。