43.求两个正整数的最大公约数和最小公倍数

编程题目:

43.从控制台输入两个正整数m和n,求其最大公约数和最小公倍数。

示例代码:

package program.calculation.exercise43;

import java.util.Scanner;

/**
* 43.从控制台输入两个正整数m和n,求其最大公约数和最小公倍数。
* 概念:
* 最大公约数:把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。
* 例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,
* 	  24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,其最大公约数是12。
* 最小公倍数:把各数中的全部公有的质因数和独有的质因数提取出来连乘,所得的积就是这几个数的最小公倍数。
* 例如:求6和15的最小公倍数,先分解质因数,得6=2×3,15=3×5,6和15的全部公有的质因数是3,
* 	  6独有质因数是 2,15独有的质因数是5,所以,其最小公倍数是30。
* 技巧:1.两个数相除,取除数和余数再相除,直到余数为零,此时的被除数为最大公约数。
* 	  2.最小公倍数等于两数的乘积除以最大公约数。
* 因为两数同时除以2以上的质数,直到两个数的商互为质数;
* 它们所有的共同约数乘积就是最大公约数,它们所有约数的乘积再乘以商的积就是最小公倍数;
* 例如:12 = 2*2*3,18 = 2*3*3,它们公共的约数为2*3,所以最大公约数为6;
* 最小公倍数当两数约数一样,只取一个,如12和18都是2*3,所以只取一个再乘以各自的商,即2*3*3*2 = 36,
* 所以最小公倍数可以等于12*18/最大公约数,就是除以多乘的2*3。
* 分析:利用辗除法。
*/

public class MaxAndMinNumber {
	public static void main(String[] args) {
		
		System.out.println("请输入两个正整数:");
		@SuppressWarnings("resource")
		Scanner scanner = new Scanner(System.in);
		int num1 = scanner.nextInt();
		int num2 = scanner.nextInt();
		
		System.out.println("第一种方式(辗除法):");
		maxAndMinNum(num1, num2);
		
		System.out.println("第二种方式(定义法):");
		int maxConvention = maxConventionNum(num1, num2);
		System.out.println("最大公约数是:"+ maxConvention);
		int minMultiple = minMultipleNum(num1, num2);
		System.out.println("最小公倍数是:"+ minMultiple);
		
	}
	
	//第一种方式(辗除法)
	private static void maxAndMinNum(int num1, int num2) {
		
		int maxConvention = 0;//最大公约数
		int minMultiple = 0;//最小公倍数
		int multiple = num1*num2;//两数的乘积
		
		//两个数相除,取除数和余数再相除,直到余数为零,此时的被除数为最大公约数
		while (num1 != 0) { 
			int temp = num2%num1;
			num2 = num1;
			num1 = temp;
		}
		maxConvention = num2;
		//最小公倍数等于两数的乘积除以最大公约数
		minMultiple = multiple/maxConvention; 
		
		System.out.println("最大公约数是:"+maxConvention);
		System.out.println("最小公倍数是:"+minMultiple);
		
	}
	
	//第二种方式(定义法)
	//求两数的最大公约数
	private static int maxConventionNum(int num1, int num2) {
		
		int maxConvention = 1;
		int min = ((num1 > num2)? num2: num1);
		for (int i=2; i<min+1; i++) {
			while ((0 == num1%i)&&(0 == num2%i)) {
				num1 /= i;
				num2 /= i;
				min = ((num1 > num2)? num2: num1);
				maxConvention *= i;
			}
		}
		return maxConvention;
	}
	
	//求两数的最小公倍数
	private static int minMultipleNum(int num1, int num2) {
		
		//第一种方式
		/*int minMultiple = 0;
		for (minMultiple=1; ; minMultiple++) {
			if((0 == minMultiple%num1)&&(0 == minMultiple%num2))
			break;
		}
		return minMultiple;*/
		
		//第二种方式
		int maxConvention = maxConventionNum(num1, num2);
		//最小公倍数等于两数的乘积除以最大公约数
		int minMultiple = (num1*num2/maxConvention);
		return minMultiple; 
		
	}

}

结果显示:

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章