1. 辗转相除法
较大的数记为 a ,较小的数记为 b ,每次都执行 c = a % b ,然后令 a = b, b = c 。直至 b = 0 时, a 为最大公约数
算法模板
int gcd(int a, int b) {if(a < b) swap(a, b);while(b) {int c = a % b;a = b;b = c;}return a;}
2. 枚举法
3. 更相减损术
更相减损术出自《九章算术》,用来求解两个数的最大公约数
较大的记为 a ,较小的记为 b 。
其操作步骤如下:
- 给定两个正整数,先判断这两个数是否都是偶数,若都为偶数,这两个数同时除以2,直到不满足两个数都为偶数这一条件(记除以2的次数为n),然后进行第2步
- 若两个数不都为偶数,用
a去减b,得到差c,然后把b,c按大小分配给a,b, 重复这一过程,直到ab相等为止
算法模板
int gcd(int a, int b) {if(a < b) swap(a, b);int n = 0;while(a%2==0 && b%2==0) {a /= 2;b /= 2;n++;}while(a != b) {a = a - b;if(a < b) swap(a, b);}return pow(2, n) * a;}
