1. /**   
  2. * gcd = greatest common diversor   
  3. * lcm = least common multiple   
  4. */   
  5. public class GcdLcmTesting {   
  6.      
  7.     /**   
  8.      * 有两种最大公约数的算法   
  9.      * 1. 欧几里得(辗转相除法)   
  10.      * 2. Stein算法   
  11.      * 这里采用的是欧几里得方法:   
  12.      * gcd(a,b)=gcd(a,b mod a)   
  13.      * @param array   
  14.      * @return   
  15.      */   
  16.     public static int gcd(int a, int b){   
  17.         int result;   
  18.         while(true){   
  19.             result = (a == 0) ? b : ((b == 0) ? a : 0);   
  20.             if (result == 0) {   
  21.                 if (a > b) {   
  22.                     a = a % b;   
  23.                 } else {   
  24.                     b = b % a;   
  25.                 }   
  26.             } else {   
  27.                 return result;   
  28.             }   
  29.         }   
  30.     }   
  31.     /**   
  32.      * 递归写法   
  33.      * @param a   
  34.      * @param b   
  35.      * @return   
  36.      */   
  37.     public static int gcdRec(int a, int b) {   
  38.         if(a > b){   
  39.             int tmp = a;   
  40.             a = b;   
  41.             b = tmp;   
  42.         }   
  43.         if(a==0)   
  44.             return b;   
  45.         else   
  46.             return gcdRec(a,b % a);   
  47.     }   
  48.  
  49.     /**   
  50.      * N个数的最大公约数   
  51.      * @param array   
  52.      * @param n   
  53.      * @return   
  54.      */   
  55.     public static int nGcdRec(int[] array, int n){   
  56.         if(n==1)   
  57.             return array[0];   
  58.  
  59.         return gcd(nGcdRec(array,n-1),array[n-1]);   
  60.     }   
  61.  
  62.      /**   
  63.      * N个数的最大公约数   
  64.      * @param array   
  65.      * @param n   
  66.      * @return   
  67.      */   
  68.     public static int nGcd(int[] array){   
  69.         int g = array[0];   
  70.         for (int i = 1; i < array.length; i++) {   
  71.            g = gcd(g ,array[i]);   
  72.         }   
  73.         return g;   
  74.     }   
  75.  
  76.   /**   
  77.    * 最小公倍数   
  78.    * lcm(a,b) = a*b/gcd(a,b)   
  79.    * @param a   
  80.    * @param b   
  81.    * @return   
  82.    */ 
  83.  
  84.     public int lcm(int a, int b){   
  85.         return a*b/gcd(a,b);   
  86.     }   
  87.     public int nLcm(int[] array,int n){   
  88.         if(n==1)   
  89.             return array[0];   
  90.         return lcm(nLcm(array,n-1),array[n-1]);   
  91.     }   
  92.  
  93. }  

求最大公约数也可写成

  1. static int gcd2(int a, int b){  
  2.     while(a!=b){  
  3.         if(a>b)  
  4.             a = a-b;  
  5.         else 
  6.             b = b-a;  
  7.     }  
  8.     return a;  

本质上和辗转相除是一样的