Java求最大公約數和最小公倍數


1. 最大公約數(Greatest Common Divisor(GCD))

1.1 基本概念

最大公因數,也稱最大公約數、最大公因子,指兩個或多個整數共有約數中最大的一個。a,b的最大公約數記為(a,b),同樣的,a,b,c的最大公約數記為(a,b,c),多個整數的最大公約數也有同樣的記號。求最大公約數有多種方法,常見的有質因數分解法、短除法、輾轉相除法、更相減損法。與最大公約數相對應的概念是最小公倍數,a,b的最小公倍數記為[a,b]。

1.2 算法

輾轉相除法

輾轉相除法:輾轉相除法是求兩個自然數的最大公約數的一種方法,也叫歐幾里德算法。

例如,求(319,377):

∵ 319÷377=0(余319)

∴(319,377)=(377,319);

∵ 377÷319=1(余58)

∴(377,319)=(319,58);

∵ 319÷58=5(余29)

∴ (319,58)=(58,29);

∵ 58÷29=2(余0)

∴ (58,29)= 29;

∴ (319,377)=29。

可以寫成右邊的格式。

用輾轉相除法求幾個數的最大公約數,可以先求出其中任意兩個數的最大公約數,再求這個最大公約數與第三個數的最大公約數,依次求下去,直到最后一個數為止。最后所得的那個最大公約數,就是所有這些數的最大公約數。

2. 最小公倍數(Least Common Multiple(LCM))

2.1 基本概念

兩個或多個整數公有的倍數叫做它們的公倍數,其中除0以外最小的一個公倍數就叫做這幾個整數的最小公倍數。整數a,b的最小公倍數記為[a,b],同樣的,a,b,c的最小公倍數記為[a,b,c],多個整數的最小公倍數也有同樣的記號。

與最小公倍數相對應的概念是最大公約數,a,b的最大公約數記為(a,b)。關於最小公倍數與最大公約數,我們有這樣的定理:(a,b)[a,b]=ab(a,b均為整數)

2.2 算法

公式法

由於兩個數的乘積等於這兩個數的最大公約數與最小公倍數的積。即(a,b)×[a,b]=a×b。所以,求兩個數的最小公倍數,就可以先求出它們的最大公約數,然后用上述公式求出它們的最小公倍數。

Java語言實現求最大公約數(GCD)和最小公倍數(LCM)

  • 程序一
package com.echo;

import java.util.Scanner;

public class GCDLCM {
	// 最大公約數
	public static int get_gcd(int n1, int n2) {
		int gcd = 0;
		if (n1 < n2) {// 交換n1、n2的值
			n1 = n1 + n2;
			n2 = n1 - n2;
			n1 = n1 - n2;
		}

		if (n1 % n2 == 0) {
			gcd = n2;
		}

		while (n1 % n2 > 0) {
			n1 = n1 % n2;

			if (n1 < n2) {
				n1 = n1 + n2;
				n2 = n1 - n2;
				n1 = n1 - n2;
			}

			if (n1 % n2 == 0) {
				gcd = n2;
			}
		}
		return gcd;

	}

	// 最小公倍數
	public static int get_lcm(int n1, int n2) {
		return n1 * n2 / get_gcd(n1, n2);
	}

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.print("請輸入第一個整數:");
		int n1 = input.nextInt();
		System.out.print("請輸入第二個整數:");
		int n2 = input.nextInt();
		System.out.println("(" + n1 + "," + n2 + ")" + "=" + get_gcd(n1, n2));
		System.out.println("[" + n1 + "," + n2 + "]" + "=" + get_lcm(n1, n2));
	}
}

  • 程序二
package com.echo;

import java.util.Scanner;

public class GCDLCM {
	// 最大公約數
	public static int get_gcd(int a, int b) {
		int max, min;
		max = (a > b) ? a : b;
		min = (a < b) ? a : b;

		if (max % min != 0) {
			return get_gcd(min, max % min);
		} else
			return min;

	}

	// 最小公倍數
	public static int get_lcm(int a, int b) {
		return a * b / get_gcd(a, b);
	}

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int n1 = input.nextInt();
		int n2 = input.nextInt();
		System.out.println("(" + n1 + "," + n2 + ")" + "=" + get_gcd(n1, n2));
		System.out.println("[" + n1 + "," + n2 + "]" + "=" + get_lcm(n1, n2));

	}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM