Java实现欧几里得法求最大公约数GCD

1.求最大公约数

(1)穷举算法1

package com.java;

//课本程序清单5-9,利用穷举法求GCD

import java.util.Scanner;

public class GreatestCommonDivisor_1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Enter the first integer: ");
        int n1 = input.nextInt();

        System.out.println("Enter the second integer:");
        int n2 = input.nextInt();

        int gcd = 1;    //初始化gcd为1
        int k = 2;      //可能的最大公约数
        //从小至大开始枚举
        while (k <= n1 && k <= n2) {
            if (n1 % k == 0 && n2 % k == 0) {
                gcd = k;
            }
            k++;
        }
        System.out.println("The greatest common divisor for " + n1 + " and " + n2 + " is " + gcd);

    }
}

(2)穷举算法2

package com.java;

//课本课后题5.14求最大公约数

import java.util.Scanner;

public class GreatestCommonDivisor_2 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter the first number: ");
        int firstNumber = input.nextInt();
        System.out.println("Enter the second number: ");
        int secondNumber = input.nextInt();

        //求两个数中的最小数,其实不用求,可以直接从firstNumber递减寻找最大公约数
        //若firstNumber是最小数,则它就是我们要用的number
        //若firstNumber不是最小数,那么在secondNumber到firstNumber之间不可能有一个数是它们两个的公约数,if不可能成立,程序不会出错
        //int number = (firstNumber < secondNumber) ? firstNumber : secondNumber;

        int gcd = 1;    //初始化最大公约数是1

        //从大至小进行遍历
        for (int k = firstNumber; k >= 1; k--) {
            if (firstNumber % k == 0 && secondNumber % k == 0) {
                gcd = k;
                break;
            }
        }

        System.out.println("The greatest common divisor for " + firstNumber + " and " + secondNumber + " is " + gcd);
    }
}

(3)穷举算法3

package com.java;

import java.util.Scanner;

//课本程序清单22-3,这个求最大公约数的方法,非常有技巧
//m和n的最大公约数无非就是四种情况
//1.m比n大,且n是m的除数,则if (m % n == 0) return n;已经包括此种情况
//2.m比n大,但是n不是m的除数。因为m和n的gcd一定是两者的除数,所以从任意一个数的一半开始向下寻找即可
//3.m比n小,但m不是n的除数。因为m和n的gcd一定是两者的除数,所以从任意一个数的一半开始向下寻找即可
//4.m比n小,且m是n的除数。因为n的除数一定小于等于n的一半,则从n的一半开始向下寻找即可
//综上,2,3,4可以直接归结为另外以中情况,即m%n!=0,因此有以下代码
public class GreatestCommonDivisor_3 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter the first number: ");
        int firstNumber = input.nextInt();
        System.out.println("Enter the second number: ");
        int secondNumber = input.nextInt();
        System.out.println("The greatest common divisor for " + firstNumber + " and " + secondNumber + " is " + gcd(firstNumber, secondNumber));
    }

    public static int gcd(int m, int n) {
        int gcd = 1;

        if (m % n == 0) return n;

        for (int k = n / 2; k >= 1; k--) {
            if (m % k == 0 && n % k == 0) {
                gcd = k;
                break;
            }
        }
        
        return gcd;
        
    }
}

(4)欧几里得算法

package com.java;

//程序清单22-4,欧几里得算法求最大公约数

import java.util.Scanner;

public class GCDEuclid {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter the first number: ");
        int firstNumber = input.nextInt();
        System.out.println("Enter the second number: ");
        int secondNumber = input.nextInt();
        System.out.println("The greatest common divisor for " + firstNumber + " and " + secondNumber + " is " + gcd(firstNumber, secondNumber));
    }

    public static int gcd(int m, int n) {
        if (m % n == 0)
            return n;
        else
            return gcd(n, m % n);
    }
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值