辗转相除法,是在$O(\log{min(a,b)} )$的复杂度求解两数最大公约数的方法

原理

对于整数$a$,$b$,记符号$(a,b)$为$a$与$b$的最大公约数。
形式化的:

$$ (a,b) = \max_{d|a \wedge d|b , d \in N^*}{d} $$

以后若未加特殊说明,其中为正整数且返回一个正整数的该符号皆默认为该定义

核心原理
存在递归式

$$ (a,b)=(a-b,b) $$

成立
证:设$(a,b)=x,(a-b,b)=y$,容易发现$x\ge y,y\ge x$,即$x=y$
证毕

那么

$$ (a,b)=(a+kb,b)(k\in \mathbb{Z}) $$

也成立
代码

int gcd(int a,int b){
    return !b ? a : gcd(b, a % b);
}

友情链接

cnblog的超详细blog~