算法 | 最大公约数与最小公倍数:辗转相除法
最大公约数
已知两个数x和y,求x和y的最大公约数
暴力循环求解:
public static void gcd(int x, int y) {
if (y > x) {//如果y>x,交换x与y
int t = x;
x = y;
y = t;
}
for (int i = y; i > 0; i--) {
if (x % i == 0 && y % i == 0) {
System.out.println(i);
break;
}
}
}
辗转相除法求解:
public static void gcd(int x, int y) {
while(true) {
if(y==0) {
System.out.println(x);
break;
}
int t=y;
y=x%y;
x=t;
}
}
辗转相除法递归求解:
public static void gcd(int x, int y) {
if (y == 0) {
System.out.println(x);
return;
}
gcd(y, x % y);
}
理解辗转相除法:
最小公倍数
【定理】:两个数的乘积等于这两个数的最大公约数与最小公倍数的积,即(a,b)×[a,b]=a×b,a,b的最大公约数记为(a,b),a,b的最小公倍数记为[a,b]。
所以[a,b]=a×b / (a,b)
两个数的最小公倍数求解:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int x = in.nextInt();
int y = in.nextInt();
System.out.println(lcm(x, y));
}
public static int lcm(int x, int y) {//求两个数的最小公倍数
return (x*y)/gcd(x,y);
}
public static int gcd(int x, int y) {
if (y == 0) {
return x;
}
return gcd(y, x % y);
}
}
求多个数的最大公约数和最小公倍数:
public class Main {
public static void main(String[] args) {
int[] nums = { 27, 18, 9, 81 };
System.out.println("最大公约数:" + gcdMore(nums, 3));
System.out.println("最小公倍数:" + lcmMore(nums, 3));
}
public static int gcd(int x, int y) {
if (y == 0) {
return x;
}
return gcd(y, x % y);
}
public static int lcm(int x, int y) {// 求两个数的最小公倍数
return (x * y) / gcd(x, y);
}
private static int gcdMore(int[] nums, int n) {// 求多个数的最大公约数
if (n == 1)
return nums[n - 1];
return gcd(nums[n - 1], gcdMore(nums, n - 1));
}
private static int lcmMore(int[] nums, int n) {// 求多个数的最小公倍数
if (n == 1)
return nums[n - 1];
return lcm(nums[n - 1], lcmMore(nums, n - 1));
}
}
讲解:
- 求n个数的最大公约数:采用递归。与求两个数的最大公约数一样,先将前面n-1个数的最大公约数求出来,再与第n个数进行辗转相除;
- 求n个数的最小公倍数:采用递归。与求两个数的最小公倍数一样,先将前面n-1个数的最小公倍数a求出来,再求该a与第n个数的最小公倍数;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统