欧几里得算法又称辗转相除法,用于计算两个非负整数a,b的最大公约数。表明两个整数的最大公约数是能够同时整除它们的最大的正整数。计算公式gcd(a,b) = gcd(b,a mod b)。
辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
结合参考资料进行推导演练:
设两数a、b(b<a)的最大公约数为c,c=gcd(a,b),且存在m,n,使得
① a=mc
② b=nc
令r为a除以b的余数,r=a mod b,即存在k使得
③ a=kb+r
求证b与r之间的最大公约数是否也为c(即a与b的最大公约数)
结合式子①②③可得 mc=knc+r,即得式子④ r=mc-knc=(m-kn)c
根据式子②和④ 证明 c为b与r的最大公约数,即证明m-kn与n互质(m-kn与n的最大公约数为1)
可通过反证法
假设存在p使得m-kn=pn,则得式子⑤r=pnc
集合式子②③⑤可得式子⑥a=knc+pnc=(k+p)nc=(k+p)b
那么a和b的最大公约数将会是nc,即b,与原设定相矛盾,故原假设不成立,m-kn与n互质
综上,可得b与r之间的最大公约数是c
以上原理成立,于是求两个数的最大公约数时,我们可以根据这个逻辑,进行逐次用前一个的除数除以余数,直到余数为0为止。那么最大公约数就是最后一个除数。
例如:求377和319的最大公约数
序号 | a | b | r |
1 | 377 | 319 | 58 |
2 | 319 | 58 | 29 |
3 | 58 | 29 | 0 |
那么377和319的最大公约数为29。
在c语言中实现参考代码
#include <stdio.h>
int main()
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
while(b>0){
int r=a%b;
a=b;
b=r;
}
printf("最大公因数是:%d",a);
return 0;
}
参考资料: