> 文档中心 > Java解决最大公约数问题、暴力枚举法、辗转相除递归法

Java解决最大公约数问题、暴力枚举法、辗转相除递归法


问题重述

最大公因数:也称最大公约数,是数学词汇,指能够整除多个整数的最大正整数,而多个整数不能都为零。

例如:8和12的最大公因数为4

方法一:暴力穷举法

方法介绍

把从1开始到两个数中较小数之间,都通过程序跑一遍,其中能被两个数整除且最大的数就是两个数的最大公约数。

源代码

  public static void main(String[] args) {         //接收键入         Scanner in = new Scanner(System.in);         System.out.println("求两个数的最大公约数:");         System.out.println("请输入两个数:");         int A = in.nextInt();         int B = in.nextInt();         //判断A、B大小,取小的值进行for循环         int s = A;         if (A>B){             s = B;         }         //不满足两数除2为0的直接输出1,否者A、B中较小的数作为for循环的限制,然后 i在[i,s]之间递增至最大公约数结束。         int jg =1;         for ( int i=2; i<=s;++i){             if (A%i == 0 && B%i  == 0){    //其实是运行了s-i+1次                 jg = i;             }         }         System.out.println(A+"和"+B+"的最大公约数是"+jg);     }

试运行结果

 

算法特点

  • 算法的时间复杂度高

  • 方法笨,思路很清晰

方法二:辗转相除递归法

方法介绍

  • 在数学中,辗转相除法,又称欧几里得算法,最大公约数是算法。辗转相除法首次出现于欧几里得的《几何原本》,而在中国则可以追溯至东汉出现的《九章算术》。

  • 原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

  • 例如:24和18的最大公约数是6(24 ÷ 18 余6,然后18 ÷ 6余0,所以6就是18和6的最大公约数,那么6也是24和18的最大公约数)

源代码

  public static void main(String[] args) {         //接收键入         Scanner in = new Scanner(System.in);         System.out.println("求两个数的最大公约数:");         System.out.println("请输入两个数:");         int A = in.nextInt();         int B = in.nextInt();         //先定义变量         int C;         int D;         int i ;         //用较大的数除较小的数,余数为零,则输出被除数就是两个整数的最大公约数;余数不为零则把被除数当做除数,把余数当做被除数继续除,直到余数为零结束         if (A>B){ ​             for (i=1;A%B!=0;i++){                 C = A%B;                 A = B;                 B = C;             }             System.out.println("最大公约数是"+B);         }else {             for (i=1;B%A!=0;i++){                 D = B%A;                 B = A;                 A = D;             }             System.out.println("最大公约数是"+A);         }     }

试运行结果

 

算法特点

  • 运用辗转相除递归法运行相对高效