问题描述
编写一函数lcm,求两个正整数的最小公倍数。
样例输入
一个满足题目要求的输入范例。
例:3 5
样例输出
与上面的样例输入对应的输出。
例:15
数据规模和约定
输入数据中每一个数的范围。
例:两个数都小于65536。
资源限制
时间限制:1.0s 内存限制:256.0MB
解题思路
两数的最小公倍数 * 两数的最大公约数 = 两数的乘积
先求最大公约数,再通过两数的乘积/最大公约数即可。
求最大公约数有很多方法,这里介绍两种。
辗转相除法
辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数。
例如,求(186,271)
∵ 186÷271=0(余186)
∴(186, 271) = (271, 186);
∵ 271÷186=1(余85)
∴(271,186) = (186, 85);
∵ 186÷85=2(余16)
∴ (186,85) = (85,16);
∵ 85÷16=5(余5)
∴ (85,16) = (16,5);
∵ 16÷5=3(余1)
∴ (16,5) = (5,1);
∵ 5÷1=5(余0)
∴ (5,1) = 1;
∴ 最大公约数为1
import java.util.Scanner;
public class Main {
public static long lcm (long a, long b) {
// 两数乘积
long result = a * b;
// 求最大公约数 辗转相除法
long temp = a % b;
while (temp != 0) {
a = b;
b = temp;
temp = a % b;
}
// b为最大公约数
result /= b;
return result;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long a = sc.nextLong();
long b = sc.nextLong();
sc.close();
System.out.println(Main.lcm(a, b));
}
}
更相减损术
第一步:任意给定两个正整数;判断它们是否都是偶数。如果是,则两数同时除以2,并记录除以2的次数,直到其中一个数或者两数为奇数时结束;反之直接执行第二步。
第二步:用大的数减小的数,接着把所得的差与较小的数比较,并以大数减小数。循环执行这个操作,直到两数差为0时结束。
则第一步中约掉的若干个2与第二步中最后的减数的乘积就是所求的最大公约数。
例1:求 98和63的最大公约数。
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
7-7=0
因为98和63不全为偶数所以7即为98和63的最大公约数。
例2:求 62和48的最大公约数。
(62, 48) 同时除2得 (31, 24)
31-24=7
24-7=17
17-7=10
10-7=3
7-3=4
4-3=1
3-1=2
2-1=1
因为62和48都是偶数,同时约掉了1个2,所以最大公约数=1*2=2
import java.util.Scanner;
public class Main {
public static long lcm(long a, long b) {
// 两数乘积
long result = a * b;
// 更相减损术
int count = 0;
// 若两数都为偶数,则两数同时除2,并记录除以2的次数
while (a % 2 == 0 && b % 2 == 0) {
a /= 2;
b /= 2;
count++;
}
long temp = Math.max(a, b) - Math.min(a, b);
// 两数相减,大数减小数,直到差为0,结束
while (temp != 0) {
a = b;
b = temp;
temp = Math.max(a, b) - Math.min(a, b);
}
// 最大公约数为b*2的count次幂 count为约掉的2的次数
b *= Math.pow(2, count);
result /= b;
return result;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long a = sc.nextLong();
long b = sc.nextLong();
sc.close();
System.out.println(Main.lcm(a, b));
}
}
作者目前是一名学生,如有考虑不周,或者有更好的方法请各路大神谅解批评指正,共同学习。