基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
提高要求:1.三种以上算法解决两个正整数最大公约数问题。
2.求3个正整数的最大公约数和最小公倍数。
import java.util.Scanner;
/**
* 求两个正整数的最大公约数和最小公倍数
* @author 123
*
*/
public class Test42 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个整数:");
int m = sc.nextInt();
int n = sc.nextInt();
System.out.println(m + "和" + n + "的最大公约数1:" + GCD1(m, n));
System.out.println(m + "和" + n + "的最大公约数2:" + GCD2(m, n));
System.out.println(m + "和" + n + "的最大公约数3:" + GCD3(m, n));
System.out.println(m + "和" + n + "的最大公约数4:" + GCD4(m, n));
System.out.println("-------------------------------------");
System.out.println(m + "和" + n + "的最小公倍数1:" + LCM1(m, n));
System.out.println(m + "和" + n + "的最小公倍数2:" + LCM2(m, n));
System.out.println(m + "和" + n + "的最小公倍数3:" + LCM3(m, n));
}
/*
* 最大公约数:辗转相除法
* 较大数除以较小数,若余数不为0,则余数作为除数,上次的除数作为被除数,
* 继续相除,直到余数为0,此时的除数即为最大公约数
*/
public static int GCD1(int m, int n) {
if (m < n) {
int temp = m;
m = n;
n = temp;
}
while (m % n != 0) {
int temp = m % n;
m = n;
n = temp;
}
return n;
}
/*
* 最大公约数:递归法
* 每次用上次的除数除以上一次余数,如果余数为0。那么除数就是最大公约数
*/
public static int GCD2(int m, int n) {
if (m < n) {
int temp = m;
m = n;
n = temp;
}
if (m % n == 0) {
return n;
}
return GCD2(n, m % n);
}
/*
* 最大公约数:相减法
* 较大数减去较小数,若减数和差相等,则差为最大公约数,否则把差和减数作比较,
* 两者中较大的数减去较小的数,如此循环
*/
public static int GCD3(int m, int n) {
while (m != n) {
if (m > n) {
m = m - n;
} else {
n = n - m;
}
}
return m;
}
/*
* 最大公约数:穷举法
* 1.z=m(m或n)
* 2.若m,n能同时被z整除,则z即为最大公约数,结束
* 3.z--,再回去执行2
*/
public static int GCD4(int m, int n) {
int z;
for (z = m; z > 0; z--) {
if (m % z == 0 && n % z == 0) {
break;
}
}
return z;
}
/*
* 最小公倍数:辗转相除法
* 用辗转相除法算出最大公约数后,用两个整数之积除以最大公约数即为最小公倍数。
*/
public static int LCM1(int m,int n){
return m*n/GCD1(m,n);
}
/*
* 最小公倍数:穷举法
* 始终使m为较小小数,依次往上加m,看每个数是否能够整除两个整数,所遇到的第一个数即为最小公倍数。
*/
public static int LCM2(int m, int n) {
if (m > n) {
int temp = m;
m = n;
n = temp;
}
for (int i = m; i <= m * n; i++) {
if (i % m == 0 && i % n == 0) {
return i;
}
}
return m;
}
/*
* 最小公倍数
* 1.定义i=1;累加,若i*n%m为0,则n*i为最小公倍数,
* 2.否则i+1,继续执行1,
* 3.若i=m,则m*n为最小公倍数
*/
public static int LCM3(int m, int n) {
if (m > n)
return LCM1(n, m);
int i = 1;
while (i++ < m) {
if (n * i % m == 0)
return n * i;
}
return m * n;
}
}