1. 程式人生 > >【程式6】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。

【程式6】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。

/*
	2017年3月2日15:10:11
	java基礎50道經典練習題 例6
  Author:ZJY(&&)
  Purpose:最大公約數和最小公倍數的應用
	最大公約數:把每個數分別分解質因數,再把各數中的全部公有質
	因數提取出來連乘,所得的積就是這幾個數的最大公約數。
  例如:求24和60的最大公約數,先分解質因數,得24=2×2×2×3,
  60=2×2×3×5,24與60的全部公有的質因數是2、2、3,它們的積是
  2×2×3=12,所以,(24,60)=12。
  最小公倍數: 把各數中的全部公有的質因數和獨有的質因數提取出來
  連乘,所得的積就是這幾個數的最小公倍數。
	例如:求6和15的最小公倍數。先分解質因數,得6=2×3,15=3×5,
	6和15的全部公有的質因數是3,6獨有質因數是2,15獨有的質因數是5,
	2×3×5=30。
	【程式6】
	題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
	程式分析:利用輾除法。
*/
public class ProgramNo6_1
{
	public static void main(String[] args)
	{
	    int num1 = 0, num2 = 0;
		try {
			num1 = Integer.parseInt(args[0]);
			num2 = Integer.parseInt(args[1]);
		}catch(ArrayIndexOutOfBoundsException e) {
			System.out.print("請輸出需要計算最大公約數的兩個數: ");
			return;
		}
		int maxConvention = maxConventionNum(num1, num2);
		System.out.println(num1 + "和" + num2 + "的最大公約數是: " + maxConvention);
		int minMultiple = minMultipleNum(num1, num2);
		System.out.println(num1 + "和" + num2 + "的最小公倍數是: " + 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 maxConvention = maxConventionNum(num1, num2);
		return (num1*num2/maxConvention); //最小公倍數等於兩數的乘積除以最大公約數
		//因為兩數同時除以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;
	}
	//方法二:
	//private static int minMultipleNum(int num1, int num2) {
		//int max = 0;
		//for (max=1; ; max++) {
			//if((0 == max%num1)&&(0 == max%num2))
				//break;
		//}
		//return max;
	//}
}


/*
	2017年3月2日15:29:25
	java基礎50道經典練習題 例6
     Author:ZJY(&&)
     Purpose:最大公約數和最小公倍數的應用
*/
public class ProgramNo6_2
{
	public static void main(String[] args)
	{
	    int num1 = 0, num2 = 0;
		try {
			num1 = Integer.parseInt(args[0]);
			num2 = Integer.parseInt(args[1]);
		}catch(ArrayIndexOutOfBoundsException e) {
			System.out.print("輸入有誤!!");
			return;
		}
		max_minNum(num1, num2);
	}
	
	//輾除法
	private static void max_minNum(int num1, int num2) {
		int temp = 0, yshu = 0, bshu = 0;

		bshu = num1*num2;
		if(num1 > num2) {
			temp = num2;
			num2 = num1;
			num1 = temp;
		}
		//兩個數相除,取最小數和餘數再相除,直到餘數為零,此時的被除數為最大公約數
		while (num1 != 0) { 
			temp = num2%num1;
			num2 = num1;
			num1 = temp;
		}
		yshu = num2;
		bshu = bshu/yshu; //最小公倍數的兩數的乘積除以最大公約數
		System.out.println(num1 + "和" + num2 + "的最大公約數是: " + yshu);
		System.out.println(num1 + "和" + num2 + "的最小公倍數是: " + bshu);
	}

}