欧几里得算法

欧几里得算法

在学习算法之初,我们一般都会遇到这个经典算法,所以就想简单的总结一下

算法的含义

算法:描述一种有限、确定、有效的并适合用计算机程序来实现的解决问题的方法。

定义一个算法可以用自然语言描述解决某个问题的过程或是编写一段程序来实现这个过程。

简介

欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。

算法的描述

自然语言的描述

计算两个非负整数a和b的最大公约数:若b是0,则最大公约数为a。否则,将a除以b得到余数r,a和b的最大公约数即为b和r的最大公约数。

Java语言描述

public static int gcd(int a,int b)
//gcd:Greatest Common Divisor 最大公约数
//大前提 a>=0,b>=0 a>b
{
    if(b==0)	return a;
    int r = a%b;
    return gcd(b,r);
}

算法的原理

  • 对于非负整数a>b,总可以写成a=b*q+r(q为正整数,r为非负整数,q=a/b,r=a%b)
  • 根据定义gcd(a,b)整除a和b,那么gcd(a,b)也必定整除r
  • 因此gcd(a,b)=gcd(b,r)
  • 假设到第k个等式rk=0,此时有gcd(a,b)=gcd(rk-2,rk-1)=rk-1
  • 求得最大公因子为rk-1
a = bq1+r1
b = r1q2+r2
r1 = r2q3+r3
r2 = r3q+r4
...
rk-3=rk-2q+rk-1
rk-2=rk-1q+rk

例如:

gcd(462,12)的递归调用
gcd(462,12)->gcd(12,6)->gcd(6,0)=6
posted @ 2021-01-17 15:20  柯南。道尔  阅读(398)  评论(0编辑  收藏  举报