1. 定义法

  1. package GCD;
  2. import java.util.Scanner;
  3. //定义法,根据最大公约数的定义进行求解
  4. public class Definition {
  5. public static void main(String[] args) {
  6. System.out.println("请输入两个非零整数:");
  7. Scanner sc = new Scanner(System.in);
  8. int a = sc.nextInt();
  9. int b = sc.nextInt();
  10. System.out.println("这两个整数的最大公约数为:"+ definition(a,b));
  11. }
  12. public static int definition(int num1, int num2) {
  13. int res;
  14. if (num1 > num2)
  15. res = num2;
  16. else
  17. res = num1;
  18. while(true) {
  19. if (num1%res == 0 && num2%res == 0)
  20. break;
  21. else
  22. res = res - 1;
  23. }
  24. return res;
  25. }
  26. }

2. 欧几里得算法

  1. package GCD;
  2. import java.util.Scanner;
  3. //欧几里得算法,又称辗转相除法
  4. public class Euclid {
  5. public static void main(String[] args) {
  6. System.out.println("请输入两个非零整数:");
  7. Scanner sc = new Scanner(System.in);
  8. int a = sc.nextInt();
  9. int b = sc.nextInt();
  10. System.out.println("这两个整数的最大公约数为:"+ euclid(a,b));
  11. }
  12. public static int euclid(int inte1, int inte2) {
  13. int surplus ;
  14. surplus = inte1%inte2;
  15. while(surplus != 0) {
  16. inte1 = inte2;
  17. inte2 = surplus ;
  18. surplus = inte1%inte2;
  19. }
  20. return inte2;
  21. }
  22. }

3. 辗转相减法

  1. package GCD;
  2. import java.util.Scanner;
  3. //辗转相减法
  4. public class Subtraction {
  5. public static void main(String[] args) {
  6. System.out.println("请输入两个非零整数:");
  7. Scanner sc = new Scanner(System.in);
  8. int a = sc.nextInt();
  9. int b = sc.nextInt();
  10. System.out.println("这两个整数的最大公约数为:"+subtraction(a,b));
  11. }
  12. public static int subtraction (int num1, int num2) {
  13. while(true) {
  14. if (num1 > num2)
  15. num1 -= num2;
  16. else if (num1 < num2)
  17. num2 -= num1;
  18. else
  19. return num1;
  20. }
  21. }
  22. }

4. 分解质因子法

  1. package GCD;
  2. import java.util.ArrayList;
  3. import java.util.Scanner;
  4. //质因数分解法,将两个数的所有质因子分解出来,然后将公共的因子相乘,得到的就是最大公约数。
  5. public class Prime {
  6. public static void main(String[] args) {
  7. System.out.println("请输入两个非零整数:");
  8. Scanner sc = new Scanner(System.in);
  9. int a = sc.nextInt();
  10. int b = sc.nextInt();
  11. System.out.println("这两个整数的最大公约数为:"+ getGCD(a,b));
  12. }
  13. public static ArrayList<Integer> getPrimeFactors(int num) {
  14. // 初始化质因子序列
  15. ArrayList<Integer> factorList = new ArrayList();
  16. // 循环迭代求质因子
  17. int i = 2;
  18. while (i <= num) {
  19. if (num % i == 0) {
  20. factorList.add(i);
  21. num /= i;
  22. } else {
  23. i++;
  24. }
  25. }
  26. return factorList;
  27. }
  28. public static int getGCD(int num1, int num2) {
  29. // 先获得绝对值,保证负数也可以求
  30. num1 = Math.abs(num1);
  31. num2 = Math.abs(num2);
  32. // 获得两个数的质因子序列
  33. ArrayList<Integer> factors1 = getPrimeFactors(num1);
  34. ArrayList<Integer> factors2 = getPrimeFactors(num2);
  35. // 设初始最大公约数为 1
  36. int gcd = 1;
  37. // 返回从开头找公共的质因子,相乘起来
  38. for (int i = 0; i < factors1.size(); i++) {
  39. for (int j = 0; j < factors2.size(); j++) {
  40. if (factors1.get(i) == factors2.get(j)) {
  41. // 将公共的质因子累乘
  42. gcd *= factors1.get(i);
  43. // num2 的质因子序列除去找到的,减少第二次重复找
  44. factors2.remove(j);
  45. // 退出第二重循环, 一次只找一对公共的质因子
  46. j = factors2.size();
  47. }
  48. }
  49. }
  50. return gcd;
  51. }
  52. }