C++求最大公约数(欧几里得算法)
C++
中求最大公约数主要采用欧几里得算法,欧几里得算法的核心其实是\(gcd(a, b) = gcd(b, a\ mod\ b)\)下面进行证明
-
对\(a\ mod \ b\)进行变换
\[\begin{align*} a\ mod\ b &= a - \left \lfloor \frac{a}{b} \right \rfloor \times b\\ &=a - c\times b \end{align*} \] -
证明对于\(a\)和\(b\)的任意公约数\(k\),都是\(b\)和\(a\ mod\ b\)的公约数
是\(b\)的公约数,同时也是\(a-c\times b\) 的公约数 -
证明对于\(b\)和\(a\ mod\ b\)的任意公约数\(m\),都是\(a\)和\(b\)的公约数
即证明\(m\)是\(a\)的公约数,\(m\)可以整除\(a\ mod\ b\),则\(m\)可以整除\(a-c\times b\)所以\(m\)可以整除\(a\)
综上所述,集合\(cd(a, b)\)等于集合\(cd(b, a\ mod\ b)\),则\(gcd(a, b) = gcd(b, a\ mod\ b)\),该过程的实现如下
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}