欧几里得算法原理
輾轉相除法簡介:
輾轉相除法, 又名歐幾里德算法(Euclidean algorithm),是求最大公約數的一種方法。它的具體做法是:用較大數除以較小數,再用出現的余數(第一余數)去除除數,再用出現的余數(第二余數)去除第一余數,如此反復,直到最后余數是0為止。如果是求兩個數的最大公約數,那么最后的除數就是這兩個數的最大公約數。
另一種求兩數的最大公約數的方法是更相減損法。
輾轉相除法舉例:
求 10 ,25的最大公約數:
25 / 10 = 2 ······5
10 / 5 ? = 2 ······0
所以10,25的最大公約數為5
輾轉相除法代碼實現:
int gcd(a, b) { return b == 0 ? a : gcd(b, a % b); } //當余數為0時,最大公約數就是a,否則繼續往下遞歸利用到的原理:(a, b)與(b, a % b)的最大公約數相同。
歐幾里德算法知識點:
1、gcd函數的遞歸層數不會超過4.785lgN + 1.6723, 其中N == max{ a,b },所以不會導致棧溢出。
2、gcd函數不僅可以求解(a, b)的最大公約數,還可以求解小公倍數,lcm(a, b) 代表(a, b)的最小公倍數
那么有lcm(a, b) * gcd(a, b) = a * b
所以:lcm(a,b) = a * b / gcd(a, b) 但是最好寫成:lcm(a,b) = a? / gcd(a, b) * b? 這樣一定程度可以避免 a * b 爆long long .
? ??
? ??
證明:
總結
- 上一篇: 栅栏密码解密——Java实现
- 下一篇: 无人驾驶全局路径规划之RRT算法