求最大公约数-辗转相除法(Java)

言:
求最大公约数的算法有很多,有更相减损法,辗转相除法等,但是较易用算法实现的,且效率相对较高的就是辗转相除法了。以下介绍用Java实现辗转相除法,记录学习通时也当作分享。
原理:
两个数的最大公约数是指能同时整除它们的最大正整数。
设两数为a、b(a≥b),求a和b最大公约数
   
的步骤如下:
(1)用a除以b(a≥b),得
   
(2)若
   
,则
   
(3)若
   
,则再用b除以
   
,得
   
.
(4)若
   
,则
   
;若
   
,则继续用
   
除以
   
,......,如此下去,直到能整除为止。
其最后一个余数为0的除数即为
   
的最大公约数。
例:用辗转相除法求(80,25)的最大公约数
80÷25=3......5
25÷5=5......0//余数为零,最大公约数为等式中的除数5
证明:
设两数为a、b(a>b),用
   
表示a,b的 最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即
   
。辗转相除法即是要证明
   
第一步:令
   
,则设
 
第二步:根据前提可知
 
第三步:根据第二步结果可知,
   
也是
   
的因数
第四步:可以断定
   
   
互质(这里用 反证法进行证明:设
   
,则
   
,则
   
,则a与b的一个公约数
   
,故c非a与b的最大公约数,与前面结论矛盾,则它们互质。又因 b=nc,r=(m-kn)c, 因此c也是b与r的最大公约数)从而可知
   
,继而
   

Java算法实现:
算法实现:
public class zhanzhuan {
	int a;	//定义被除数
	int b;	//定义除数
	int f(int a,int b) {
		this.a=a;
		this.b=b;
		int c;
		if(a<b) {	//将a设为较大数
			c=a;
			a=b;
			b=c;
		}
		int r=a%b;
		while(r!=0) {		//辗转相除
			a=b;
			b=r;
			r=a%b;
		}
		return b;		//b为最大公约数
	}
}

  调用:
class test{		//调用部分
	public static void main(String[] args) {
		zhanzhuan z = new zhanzhuan();
		z.a=98;
		z.b=26;
		System.out.println(z.a+"和"+z.b+"两数的最大公约数是:"+z.f(z.a, z.b));
	}
}
  结果:






猜你喜欢

转载自blog.csdn.net/weixin_40425481/article/details/78199498