首页 > 代码库 > 求两个数的最大公因数

求两个数的最大公因数

这里提供两种方法:一种比较朴素,基本思想很简单就是按照从大到小的找能够匹配的因数,找到就返回;另一种是欧几里得算法,该算法的核心思想是,当前两个数的最大公因数的也是这两个数模的与其中一个元素的的最大公因数,然后递归算出。当两个数的模等于0时,则找到了最大公因数。

第一种:朴素的算法

算法思想:基本思想很简单就是按照从大到小的找能够匹配的因数,找到就返回;

时间复杂度:O(n)

代码(Java实现):

 1 package Gcd;
 2 /*
 3  * 求两个数的最大公因数的朴素算法。
 4  */
 5 public class gcd1 {
 6     public static int gcd_find(int a,int b){
 7         //先找一个数的当前最大因数,当前因数是否是另一个数的因数,如果是则返回,否则找下一个较小的因数,直到找到为止
 8         if(b%a==0)
 9             return a;
10         int nowMaxGid=a/2;
11         for(int i=nowMaxGid;i>=1;i--){
12             if(a%i==0&&b%i==0){
13                 return i;
14             }
15         }
16         return 1;
17     }
18     public static void main(String[] args) {
19         System.out.println(gcd_find(88,1000));
20     }
21 
22 }

红色标记的是核心代码。

第二种:欧几里得算法

算法思想:该算法的核心思想是,当前两个数的最大公因数的也是这两个数模的与其中一个较小的元素的的最大公因数,然后递除算出。当两个数的模等于0时,则找到了最大公因数。

时间复杂度:O(logn)

代码(Java实现):

 1 package Gcd;
 2 /*
 3  * 求出两个数的最大公因数(欧几里得算法)
 4  */
 5 public class gcd2 {
 6 
 7     public static int gcd_find(int a,int b){
 8         
 9         while(b!=0){
10             int mark=a%b;
11             a=b;
12             b=mark;
13         }
14         return a;
15     }
16     public static void main(String[] args) {
17         System.out.println(gcd_find(10,8));
18     }
19 }

通过两种方法的对比,欧几里得算法计算时间特别快,而朴素算法则差很多,特别当数很大的时候,更是需要花费更多时间。

求两个数的最大公因数