6 【程序 6 求最大公约数及最小公倍数】
题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。
程序分析:利用辗除法。
方法一:穷举法
import java.util.Scanner;
public class Practise_01 {
public static void main(String[] args) {
//题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。
System.out.println("please enter two numbers:");
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
System.out.println();
int n = sc.nextInt();
//求最大公因素
for(int i = n;n>0;i--) {
if(m%i==0 && n%i==0) {
System.out.println("最大公因素是"+i);
break;
}
}
//求最小公倍数
for(int i = n;;i++) {
if(i%n==0 && i%m==0) {
System.out.println("最小公倍数是"+i);
break;
}
}
}
}
方法二:利用辗转相除法求两个整数的最大公约数和最小公倍数
首先,什么是辗转相除法?
举个例子,利用辗转相除法,来求1211,341的最大公约数
我们是不是可以有这么一条逻辑链
1可以倍乘得到4
1和4可以得到9
1,4,9可以得到13
1,4,9,13可以得到35
……
直到1,4,9,13,35,153,188,341的各自的K(k>=0)次幂的和等于1211
我们知道任何一个数都可以用二进制数来表示, 比如7 = 2^0 * 1 + 2^1 * 1 + 2^2 * 1
我们姑且认为7是由集合{1,2,4,…}中的元素组成的
那么1211也可以用一个给定的集合{1,4,9,13,35,153,188,341}组成
而这个集合中最小的元素可以组成这个集合中所有的元素, 就像1可以得到1,2,4一样
所以求最小的公约数其实就是找到谁才应该是这个集合中最小的元素. 那么当第二小的元素除以某一个数x余数为0时, 那么很明显x就是集合中最小的那个元素了.
求出了最大公约数,接下来就很简单了。
最小公倍数 = 两个整数的乘积 / 最大公倍数
实现代码如下:
import java.util.Scanner;
public class gongBeiShu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("please enter two numbers:");
int i1 = sc.nextInt();
int i2 = sc.nextInt();
int yueShu = gcd(i1,i2);
System.out.println(i1+"与"+i2+"最大公约数是:"+yueShu);
int beiShu = i1*i2/yueShu;
System.out.println(i1+"与"+i2+"最小公倍数是:"+beiShu);
}
public static int gcd(int a,int b) {
int p;
if(a%b==0) p=b;
else p=gcd(b,a%b);
return p;
}
}
熟记算法诀窍:
递归函数一般写出前面两部就ok.
(补充说明:该算法可以用于正负整数,同时整数输入顺序无分大小先后,皆可求出两个整数的最大公约数)
补充两个整数的质因素,与二者最大公因素和最小公倍数之间的关系:
两个整数的最大公约数=他们共有的质因素的乘积
两个整数的最小公倍数=他们共有的质因素的乘积,再乘以他们各自独有的质因素
为什么最小公倍数等于两个数的乘积除以最大公因数?
因为两个整数的乘积除以他们公有的部分(即最大公因数)后,他即是前一个整数的整数倍,又是后一个整数的整数倍。
例如:
12 = 2X2X3
18 = 2X2X3
公有的质因素是2和3,独有的质因素12是2,18是3
因此
最大公因数=2X3=6
最小公倍数=2X3X2X3=36