package com.java;//课本程序清单5-9,利用穷举法求GCDimport java.util.Scanner;publicclassGreatestCommonDivisor_1{publicstaticvoidmain(String[] args){
Scanner input =newScanner(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为1int 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,因此有以下代码publicclassGreatestCommonDivisor_3{publicstaticvoidmain(String[] args){
Scanner input =newScanner(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));}publicstaticintgcd(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;publicclassGCDEuclid{publicstaticvoidmain(String[] args){
Scanner input =newScanner(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));}publicstaticintgcd(int m,int n){if(m % n ==0)return n;elsereturngcd(n, m % n);}}