最大公约数和最小公倍数
最大公约数
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。
使用穷举法求最大公约数
//参数代入两个整型数
public int Gcd(int a,int b){
//求出a,b两数的最小数赋值给min
//因为两个数的最大公约数最大也就是两数中的小数
int min = a<b?a:b;
//gcd就是最后返回的最大公约数
int gcd = 1;
//循环,从小往大
for(int i=1;i<=min;i++){
//当i可以整除两数时,i就是两数的公因子
if(a%i==0 && b%i==0)
gcd = i;
}
//返回最大公约数
return gc;
}
穷举法太过粗暴,我们可以加入一些算法,使其精简
使用欧几里得算法(Euclidean Algorithm)
欧几里得算法
指的是(a,b)的任何公约数必定是
a
−
k
b
=
r
a-kb=r
a−kb=r的因子
a可以表示为 a = k b + r a=kb+r a=kb+r(a,b,k,r皆为正整数,且r≠0)
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被整除
而 r = a − k b r=a-kb r=a−kb,两边同时除以d, r ÷ d = a ÷ d − k b ÷ d r\div d=a\div d-kb\div d r÷d=a÷d−kb÷d,由等式右边可得, r ÷ d r\div d r÷d是整数,因此d|r
因此d也是(b,a mod b)的公约数
(a,b)和(b,a mod b)的公约数相同,则最大公约数也相等
我们可以通过一个例子来了解,求gcd(190,34)
首先用两数的小者34去除两数的大者190,得到:
190
=
5
×
34
+
20
190=5\times34+20
190=5×34+20
34和190的任何公约数也必定是
190
−
5
×
34
=
20
190-5\times 34=20
190−5×34=20的因子,而且20和34的任何公约数也必定是
5
×
34
+
20
=
190
5\times 34+20=190
5×34+20=190的因子。因此34和190的最大公约数与20和34的最大公约数相同。
34
=
1
×
20
+
14
34=1\times 20+14
34=1×20+14
同理,gcd(34,20)=gcd(20,14),接着用14除以20
20 = 1 × 14 + 6 20=1\times 14+6 20=1×14+6,继续用6除以14
14 = 2 × 6 + 2 14=2\times 6+2 14=2×6+2,继续用2除以6
6 = 3 × 2 + 0 6=3\times 2+0 6=3×2+0,因为6整除2,所以gcd(6,2)=2
由于gcd(190,34)=gcd(34,20)=gcd(20,14)=gcd(14,6)=gcd(6,2)-2,最初的问题得解gcd(190,34)=2
算法
我们可以把他写成算法
//(a,b)为求最大公约数的两个整数
public int Gcd(int a,int b){
if(a%b==0) return b;
else{
return Gcd(b,a%b);
}
}
- 有的朋友可能疑惑要不要确保 a > b a>b a>b这个问题,其实是没有问题的,接着那上面的例子来说gcd(34,190)
34 = 0 × 190 + 34 34=0\times 190+34 34=0×190+34那么就会返回gcd(190,34),所以没必要确保 a > b a>b a>b
这就是欧几里算法,大大减少了计算量,是个优秀的算法
最小公倍数
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
使用穷举法求最小公倍数
public int Lcm(int a,int b){
//求出a,b两数的最大数赋值给max
//因为两个数的最小公倍数最小也就是两数中的大数
int max = a>b?a:b;
//lcm就是最后返回的最小公倍数
int lcm = max;
//循环
for(int i=max;i<=(a*b);i++){
//当i第一次被a,b整除时,i就是a,b的最小公倍数
if(i%a==0 && i%b==0){
lcm = i;
//跳出循环
break;
}
}
//返回最小公倍数
return lcm;
}
穷举法太过粗暴,我们可以找到一个快捷的方法
用最大公约数求最小公倍数
a × b = g c d ( a , b ) × l c m ( a , b ) a\times b=gcd(a,b)\times lcm(a,b) a×b=gcd(a,b)×lcm(a,b)
可知a和b的乘积等于a,b的最大公约数和最小公倍数的乘积
所以
l
c
m
(
a
,
b
)
=
a
×
b
÷
g
c
d
(
a
,
b
)
lcm(a,b)=a\times b\div gcd(a,b)
lcm(a,b)=a×b÷gcd(a,b)
public int Lcm(int a,int b){
return a*b/gcd(a,b);
}