欧几里得算法求最大公约数和最小公倍数

欧几里德算法又称辗转相除法,可用于计算两个正整数的最大公约数。而对于两个正整数的最小公倍数呢,有这样一个定理:

对于两个正整数 a 和 b,有gcd(a, b) * lcm(a, b) == a * b。

下面看具体的实现代码: 

	/*
	 * 求解最大公约数(递归实现)
	 */
	public static int gcd(int a, int b) {

		if (a < 0 || b < 0)
			return -1;
		if (b == 0)
			return a;
		return gcd(b, a % b);
	}

	/*
	 * 求解最大公约数(非递归实现)
	 */
	public static int gcd1(int a, int b) {

		int temp;
		while (a % b != 0) {
			temp = a % b;
			a = b;
			b = temp;
		}
		return b;
	}

	/*
	 * 求解最小公倍数 定理:对于两个正整数 a和 b,有gcd(a, b) * lcm(a, b) == a * b
	 */
	public static int lcm(int a, int b) {

		if (a < 0 || b < 0)
			return -1;
		return a * b / gcd(a, b);
	}

对于求三个及以上正整数的最小公倍数,我们可以先求出其中两个数的最小公倍数,再求这个最小公倍数与另个一数的最小公倍数,这样下去最后的结果将是这组数的最小公倍数。

设计思路:

声明一个数组a[n]来存n个要求最小公倍数的正整数,从a[1]开始的每一个a[ i ],求a[ i ] = lcm( a[ i ],a[ i - 1 ] ),依次求下去,最后一步是a[n-1] = lcm( a[n-1],a[n-2] )。a[n - 1]也就是所求结果。具体代码如下:
 

        /*
	 * 求解正整数数组a中所有元素的最小公倍数
	 */
	public static int f(int[] a) {

		for (int i = 1; i < a.length; i++) {
			a[i] = lcm(a[i], a[i - 1]);
		}
		return a[a.length - 1];
	}

 

你可能感兴趣的:(程序人生)