- /**
- * gcd = greatest common diversor
- * lcm = least common multiple
- */
- public class GcdLcmTesting {
- /**
- * 有两种最大公约数的算法
- * 1. 欧几里得(辗转相除法)
- * 2. Stein算法
- * 这里采用的是欧几里得方法:
- * gcd(a,b)=gcd(a,b mod a)
- * @param array
- * @return
- */
- public static int gcd(int a, int b){
- int result;
- while(true){
- result = (a == 0) ? b : ((b == 0) ? a : 0);
- if (result == 0) {
- if (a > b) {
- a = a % b;
- } else {
- b = b % a;
- }
- } else {
- return result;
- }
- }
- }
- /**
- * 递归写法
- * @param a
- * @param b
- * @return
- */
- public static int gcdRec(int a, int b) {
- if(a > b){
- int tmp = a;
- a = b;
- b = tmp;
- }
- if(a==0)
- return b;
- else
- return gcdRec(a,b % a);
- }
- /**
- * N个数的最大公约数
- * @param array
- * @param n
- * @return
- */
- public static int nGcdRec(int[] array, int n){
- if(n==1)
- return array[0];
- return gcd(nGcdRec(array,n-1),array[n-1]);
- }
- /**
- * N个数的最大公约数
- * @param array
- * @param n
- * @return
- */
- public static int nGcd(int[] array){
- int g = array[0];
- for (int i = 1; i < array.length; i++) {
- g = gcd(g ,array[i]);
- }
- return g;
- }
- /**
- * 最小公倍数
- * lcm(a,b) = a*b/gcd(a,b)
- * @param a
- * @param b
- * @return
- */
- public int lcm(int a, int b){
- return a*b/gcd(a,b);
- }
- public int nLcm(int[] array,int n){
- if(n==1)
- return array[0];
- return lcm(nLcm(array,n-1),array[n-1]);
- }
- }
求最大公约数也可写成
- static int gcd2(int a, int b){
- while(a!=b){
- if(a>b)
- a = a-b;
- else
- b = b-a;
- }
- return a;
- }
本质上和辗转相除是一样的