欧几里得算法:又称辗转相除法,是指用于计算两个非负整数a,b的最大公因数。两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
前言
今天做力扣题第1071题,我用我的思路去做那道题,只能求出来最小公因数,但是题目中要的是最大公因数,所以我在大佬的解题思路中找到了这个,在b站上学了学。
b站视频 ==》 欧几里得演算法 当然b站上没代码,代码放在下面了欧!!!
不想看b站的可以看下面的,简介通俗:
一、欧几里得算法
在欧洲,数学一般都会用长度去表示,比如求 6 和 16 的最大公因数 则会画一个长为16,宽为 6 的长方形,在欧几里得算法的思想中,它会将 6X16 的长方形划分为许多正方形,这些正方形的边长是未划分长方形的宽。如下:6x16的长方形会划分为两个6x6的正方形和一个4x6的长方形,4x6的长方形划分为一个 4x4的正方形和一个4x2的长方形,继续划分,最后如下:
下图中,可以看出来划分最小的正方形的边长为2 则6和16的最大公因数则是2
这种简单的可以用这样子,那如果求一个比较难点儿的 12921和4234的公因数呢?
从上面的例子中可以总结出来:
- 16与6求余数为4 是右边的长方形的宽 长则是6
- 6与4求余数为2 则是右上的长方形的宽和长
- 4与2求余数为0 则最后把剩下的长方形切分完了
- 最后可以的出来一个结论了吧:除第一次外,每一次都是用上一个被除数除以上一个余数看的出来的余数是否等于0 不等于0则继续求余数,等于0的话则此次的被除数为最大公因数
12921和4234的公因数也可以这样子:
如上,最大的公因数为 73 则可以的到一个公式 :
现在求 A 与 B的最大公因数 设它们的余数为 R。则(A,B)的最大公因数为(B,R)的最大公因数,推导式如下:
A / B = q ...... R. A是被除数,B是除数,q是相除得出来的值. R是余数。 A = Bq + R ==》 R = A - Bq
设 A=a*u B = b*u
R = A - Bq
= A * u - B * u * q
= u * (A - B * q) 因为可以保证 A 和 B q都是整数 所以 A - B * q 的值也为整数 =》 n(替代一下)
= u*n
由此可以看出来 A = a*u, B = b * u, R = n * u 它们的最大公因式都是u 所以说上面的公式成立
二、代码
int gcd(int a,int b){
return b == 0 ? a : gcd(b,a%b);
}
总结
不管怎么样,一定要努力学习,加油!!!