一、求最大公约数
一个既能整除 a 又能整除 b 的最大整数。如,求 15
与 40
的最大公约数
.
方法一:暴力枚举
- 起始条件:最大公约数肯定不大于
Math.min(A,B)
,循环的起始条件(i=a
)很容易确定。 - 判断条件:相信理解最大公约数定义也不难确定(
a%i==0 && b%i==0
)
public class Main {
public static void gcd0() {
int a = 15, b = 40;
int min = Math.min(a, b);
for(int i = min; i >= 1; --i) {
if(a % i==0 && b % i==0) {
System.out.print(i + "、");
break; //因为是最大公约数,所以要提前退出循环 --> 5
}
}
System.out.println(gcd(15, 40));
}
}
算法大致思路就是,不断地缩减a
的值,直到 >= 1
方法二:更相减损法
出自《九章算术》,适用于任何需要求最大公约数的场合。
while(a != b) {
if (a > b) a = a-b;
else b = b-a;
}
printf("%d\n",a);
求法二:辗转相除法
知道两个数的最大公约数还可以算出两个数之间的最小公倍数。
*一句话总结 :用 x 去对 yx\cfrac{y}{x}xy 的余数取模。
递归
public static int gcd(int x, int y) {
return x == 0 ? y : gcd(y%x, x); //5
}
迭代
int gcd(int x, int y) {
int c = 0;
while (x != 0) {
int t = x;
x = y % x;
y = t;
}
return y;
}
mm:x==0?y:gcd(y%x, x)
二、求最小公倍数
求 x 和 y 的最小公倍数,先求 x 和 y 的最大公约数,然后用 x × y 的积除以 gcd(x,y)
int t = x * y
int res = t / gcd(x, y);