JAVA算法:欧几里德算法(GCD)又称辗转相除法计算两个整数a,b的最大公约数(JAVA代码)

JAVA算法:欧几里德算法(GCD)又称辗转相除法计算两个整数a,b的最大公约数(JAVA代码)

package com.bean.algorithmbasic;

public class GDCDemo {
	
	/*
	 * 欧几里德算法(GCD)又称辗转相除法,用于计算两个整数a,b的最大公约数。
	 * 基本思路:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。
	 * */

	public static int gcd(int a, int b) {
		if (b==0) {
			return a;
		}else {
			return gcd(b,a%b);
		}
		
	}
	
	/*
	 * 扩展算法
	 * 
	 * 基本思路:对于不全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,
	 * 必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。
	 * 
	 * 证明:设 a>b。
	 * 1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
	 * 2,ab!=0 时,设 ax1+by1=gcd(a,b); bx2+(a mod b)y2=gcd(b,a mod b);
	 * 根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);
	 * 则:ax1+by1=bx2+(a mod b)y2;
	 * 即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;
	 * 根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;
	 * 这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2
	 * 上面的思想是以递归定义的,因为 gcd不断的递归求解一定会有个时候 b=0,所以递归可以结束。
	 *  
	 * */
	
	
	public static int[] egcd(int a,int b) {
		
		int[] array=new int[2];
		if(b==0) {
			array[0]=1;
			array[1]=0;
			return array;
		}else {
			array=egcd(b,a%b);
			array[0]=array[1];
			array[1]=array[0]-a/b*array[1];
			return array;
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int x=8;
		int y=12;
		int result=gcd(x,y);
		System.out.println("RESULT is: "+result);
		
		int[] array=egcd(x,y);
		System.out.println("RESULT is: "+array[0]+"\t"+array[1]);
		
	}

}

程序运行结果:

RESULT is: 4
RESULT is: 0    0

 

你可能感兴趣的:(算法分析与设计,JAVA算法学习)