在学习辗转相除法前,先了解与其密切相关的更相减损术。
更相减损术原理(总结):两个数的的和若可以被最大公因数m整除,而且两数中有一个数m被整除,则另外一个数也可以被m整除。(最大公因数存在便满足)然后这两数相减,得到第三个数(大减小),三个数的关系为第三个数和较小数的和为较大的那个数。(对比发现,满足最开始两数和与m的关系)重复该过程,当两数相减为零时,最大公因数便找到了(最后得出的两数中的任意一个)
例子:161和63
161-63=98
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
7-7=0
如此便得到最大公因数7
那再来了解辗转相除法
其实会发现,它的是更相减损术的浓缩。
它将两个数相减的过程变为两数求余的形式,使两数相减不必再判断两个数的大小。
#include<stdio.h>
int main()
{
int a,b,t;
scanf("%d %d",&a,&b);
while(b!=0)
{
t=a%b;///这一行可以看为实现两数相减且无需判断大小的过程
a=b;
b=t;
}
printf("%d",a);
return 1;
}
我们可以拿161和98试试,发现无论a=161,
b=98还是a=98,b=161在其中会被转为小数在下,大数在上。
我么可以尝试推一推。
t=161%98
t=63;
a=98;
b=63;
以及
t=98%161
t=98;
a=161;
b=98;
因为这个原因,程序在运行中,就变为了从我们所想的的大数减小数形式了。
161 98
7
Process returned 1 (0x1) execution time : 3.950 s
Press any key to continue.
98 161
7
Process returned 1 (0x1) execution time : 3.250 s
Press any key to continue.
最后结束时,在更相减损术中是找到两个数相减为零 。在辗转相除法中是a能被b整除。
我的辗转相除法的小结到此结束。
(第一次写博客,希望大家支持,谢谢!!)