最大公约数算法,又称欧几里德算法,至今已有几千年的历史了。在我们开始学习C语言的时候最常用的算法就是辗转相除法,其实在linux内核中,内核也是使用这样的方法实现两数最大公约数的计算。
两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);
算法原理:
我们来看看代码:
一样的,从linux内核中把代码抠出来。
#include <stdio.h> #include <stdlib.h> /* * swap - swap value of @a and @b 这个宏实现和a和b两个参数之间的交换 */ #define swap(a, b) \ do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0) /* Greatest common divisor */ unsigned long gcd(unsigned long a, unsigned long b) { unsigned long r; //判断,如果参数a < b 的话就把两数进行交换 if (a < b) swap(a, b); while ((r = a % b) != 0) { //如果两数取模运算不为0,就循环取到0为止 a = b;//将b的值赋值给a b = r;//将r的值赋值给b } return b; //返回b的值 } //以上其实就是典型的辗转相除法 int main(void) { printf("%ld\n",gcd(12,18)); return 0 ; }运行结果:
12和18的最大公约数为6