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; 
		
	}

}

結果顯示:

在這裏插入圖片描述

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