题目:求两个正整数的最大公约数和最小公倍数
方法一:欧几里德算法
package zuoye;
import java.util.Scanner;
/**
* 求两个正整数的最大公约数和最小公倍数
* @author
*
*/
public class Exanple01
{
public static void main(String[] args)
{
System.out.println("输入两个数,求这两个数的最大公约数和最小公倍数");
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数:"); //输入第一个数
int x = scan.nextInt();
System.out.println("请输入第二个数:"); //输入第二个数
int y = scan.nextInt();
int yin = maxCommonFactor( x, y);
int bei = maxCommonMultiple(x,y);
System.out.println("最大公因数为:"+yin);
System.out.println("最小公倍数为:"+bei);
}
/**
* 求最大公因数:
* 采用欧几里德算法:
* 用两者之间最大的那个数整除另外一个数,获取余数
* (1)若两个数相等,则最大公约数为两者中的一个;
* (2)若两个数不相等,则用大的那个数对小的那个数取余,然后把小的那个数
* 作为被除数,把余数作为除数,如此循环,直到除数为0停止。
* @param m
* @param n
* @return
*/
public static int maxCommonFactor(int m,int n) {//求最大公约数
int t = 0;
if(m<n) //无论何时,都让m为最大的那个数n为较小的那个数
{
t = n;
n = m;
m = t;
}
while(n != 0)
{
if(m == n) //若两个数相等,最大公因数为其中之一
{
return m;
}
else{
int k = m%n; //若两个数不相等,用最大数对小的那个数取余,直至除数为0
m = n;
n = k;
}
}
return m;
}
/**
* 采用公式法求最小公倍数:
* 由于两个数的乘积=这两个数的最大公约数X最小公倍数
* 所以求出最大公约数后,最小公倍数=两数之积/最小公约数
* @param m
* @param n
* @return
*/
public static int maxCommonMultiple(int m,int n) { //求最小公倍数
int z = m*n; //两数之积
int temp = maxCommonFactor(m,n); //调用求最大公约数的方法,得到最大公约数
return (z/temp); //用两数之积/最大公约数,返回最小公倍数
}
}
方法二:更相减损法
package zuoye;
import java.util.Scanner;
public class Example02 {
public static void main(String[] args) {
System.out.println("输入两个数,求这两个数的最大公约数和最小公倍数");
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数:"); //输入第一个数
int x = scan.nextInt();
System.out.println("请输入第二个数:"); //输入第二个数
int y = scan.nextInt();
maxCommonFactor(x,y);
int bei = maxCommonMultiple(x,y);
}
/**
* 采用更相减损法求最大公约数:
* (1)任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
* (2)以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。
* 继续这个操作,直到所得的减数和差相等为止。
* (3)则第(1)步中约掉的若干个2与第(2)步中等数的乘积就是所求的最大公约数。。
*/
public static int maxCommonFactor(int m,int n) //求最大公约数
{
int t = 0; //记录两个数整除2的次数
while((m %2 == 0) && (m % 2 == 0)) //判断两个数是否能整除2
{
m = m/2;
n= n/2;
t++;
}
while(m != n) { //用较大的数减去较小的数,直到减数和差相等
if(m>n)
{
m = m-n;
}else {
n = n-m;
}
}
if(t == 0) //能整除2的次数为0
{
System.out.println("最大公约数为:"+m);
}else //能被2整除的次数不为0
{
System.out.println("最大公约数为:"+2*t*m);
}
return m;
}
/**
* 求最小公倍数:
* (1)先找到两者之中,较大的那个数
* (2)如果较大的数对较小的数取余:
* 余数为0,则最大公倍数为两数之积除以较小的那个数
* 余数不为0,则把余数作为除数,较小的那个数作为被除数,循环取余,
* 直到余数为0,则最大公倍数就是原来两数之积除以那个最小的余数
*
* @param m
* @param n
* @return
*/
public static int maxCommonMultiple(int m,int n)//求最大公倍数
{
int t = 0;
int z = m*n; //两数之积
if(m<n) //总是让m为最大的那个数,n为较小的那个数
{
t = n;
n = m;
m = t;
}
while(true)
{
int k = m%n; //两数取余
if(k==0) //判断余数是否为0
{
System.out.println("最小公倍数为:"+z/n);
break;
}else { //余数不为0,把余数作为除数,
m = n; // 较小的那个数作为被除数,循环取余,直到余数为0
n = k;
}
}
return m;
}
}
方法三:定义一个数,这个数从输入的两个数中最小的那个数开始递减。并让输入的两个数对这个数分别取余,若两个数对这个数余数第一次同时为0时,这个数则为最大公约数。
package zuoye;
import java.util.Scanner;
public class Example03
{
public static void main(String[] args) {
System.out.println("输入两个数,求这两个数的最大公约数和最小公倍数");
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数:"); //输入第一个数
int x = scan.nextInt();
System.out.println("请输入第二个数:"); //输入第二个数
int y = scan.nextInt();
maxCommonFactor(x,y);
maxCommonMultiple(x,y);
}
/**
* 求最大公约数:
* 定义一个数,这个数从输入的两个数中最小的那个数开始递减。并让输入的两个数
* 对这个数分别取余,若两个数对这个数余数第一次同时为0时,这个数则为最大公约数
* @param m
* @param n
* @return
*/
public static int maxCommonFactor(int m,int n) //求最大公约数
{
if (m < n) //让m永远是最大的那个数
{
m = m +n;
n = m -n;
m = m -n;
}
for(int t =n;t>0;t--) //t为定义的递减的那个数
{
if((m % t==0)&&(n%t==0))
{
System.out.println("最大公约数为:"+t);
break;
}
}
return m;
}
/**
* 求最小公倍数:
* (1)先找到两者之中,较大的那个数
* (2)如果较大的数对较小的数取余:
* 余数为0,则最大公倍数为两数之积除以较小的那个数
* 余数不为0,则把余数作为除数,较小的那个数作为被除数,循环取余,
* 直到余数为0,则最大公倍数就是原来两数之积除以那个最小的余数
*
* @param m
* @param n
* @return
*/
public static int maxCommonMultiple(int m,int n)//求最大公倍数
{
int t = 0;
int z = m*n; //两数之积
if(m<n) //总是让m为最大的那个数,n为较小的那个数
{
t = n;
n = m;
m = t;
}
while(true)
{
int k = m%n; //两数取余
if(k==0) //判断余数是否为0
{
System.out.println("最小公倍数为:"+z/n);
break;
}else { //余数不为0,把余数作为除数,
m = n; // 较小的那个数作为被除数,循环取余,直到余数为0
n = k;
}
}
return m;
}
}
求三个数的最大公约数和最小公倍数
package zuoye;
import java.util.Scanner;
public class Example04
{
public static void main(String[] args)
{
System.out.println("输入三个数,求这三个数的最大公约数和最小公倍数");
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数:"); //输入第一个数
int x = scan.nextInt();
System.out.println("请输入第二个数:"); //输入第二个数
int y = scan.nextInt();
System.out.println("请输入第三个书:");
int z = scan.nextInt();
maxCommonFactor(x,y,z);
int bei = maxCommonMultiple(x,y,z);
System.out.println("最小公倍数为"+bei);
}
/**
*
* 求最大公约数:
* 定义一个数,这个数从输入的三个数中最小的那个数开始递减。并让输入的三个数
* 对这个数分别取余,若三个数对这个数余数第一次同时为0时,这个数则为最大公约数
* @param a
* @param b
* @param c
* @return
*/
public static int maxCommonFactor(int a,int b,int c)//求最大公约数
{
//对a、b、c排序,永远让a>b>c
if(a < b) {
int t = a;
a = b;
b = t;
}
if(a < c) {
int t = a;
a = c;
c = t;
}
if(b < c) {
int t = b;
b = c;
c = t;
}
//System.out.println(a+" "+b+" " +c);//对结果进行检验
for(int t = c;t>=0;t--) //t为定义的递减的那个数
{
//若三个数同时除以从最小数开始递减的数为0时,则这个数为最大公约数
if((a % t==0)&&(b%t==0)&&(c %t ==0))
{
System.out.println("最大公约数为:"+t);
break;
}
}
return a;
}
/**
* 求最小公倍数
* (1)先求出三者之中,最大的那个数
* (2)定义一个数,令此数为最大的那个数,可以无限大;
* 这个数从初值(最大的数)开始每次递增1,并且用这个数对输入的三个数分别取余,
* 若余数同时为0时,此时这个数为最小公倍数
* @param a
* @param b
* @param c
* @return
*/
public static int maxCommonMultiple(int a, int b, int c){ //求最小公倍数
int max = getMax(a,b,c);
for(int i=max ; ;i++){ //定义这个数为i,从最大数开始递增
if(i%a==0&i%b==0&&i%c==0){
return i;
}
}
}
public static int getMax(int a, int b, int c){ //求三个数中的最大数
if(a < b)
{
int t = a;
a = b;
b = t;
}
if(a < c)
{
int t = a;
a = c;
c = t;
}
if(b < c)
{
int t = b;
b = c;
c = t;
}
return a;
}
}
总结:最大公约数的算法主要是欧几里德算法和更相减损法,主要思路清楚,算法并不难。三个数的求法思路和两个数的相同,主要还是要细心。