1.数学原理
下面我会用(a,b) 来表示a和b的最大公因数
a ➗ b = q ....r -----------------------(1)
定理:(a,b)= (b,r)
只需要证明上面定理成立,就能证明辗转相除成立。
上面(1)公式还能化成
a = bq + r --------------------------------(2)
r = a - bq ---------------------------------(3)
假设 (a,b) = c --------------------------(4)
a = mc , b = nc (m,n是假设的未知数)
由(3)式得:
r = a - bq = mc - ncq = (m-nq)c-------(5)
假设(b,r)= d ---------------------------(6)
b = xd , r = yd (x,y 是假设的未知数)
由(2)式得:
a = bq + r = xdq + yd = (xq+y)d--------(7)
引理:(a1,a2,a3,.......,an) = ( (a1,a2),a3,a4,.........an)
所以: (a,b,r) = ( (a,b),r)
由(4)(5)得:
(a,b,r) = ( (a,b), r ) = ( c, r ) = ( c , (m-nq)c ) = c
由(6)(7)得:
(a,b,r) = ( (b,r), a ) = ( d, a) = ( d , (xq+y)d ) = d
因此 c = d,即(a,b) = (b , r)定理成立。
a ➗ b = q ....... r
定理:(a , b)= (b , r)
假设求 6和8的最大公因数
8 ➗ 6 = 1 ........ 2
6 ➗ 2 = 3 ........ 0
因为0除以任何非零整数都为0,所以0和任何非零整数的最大公因数是非零整数。
当余数为 0 时,被除数 2 就是 0和2的最大公因数,也就是 6 和 8 的最大公因数。
(根据 a ➗ b = q ....... r
(a , b)= (b , r) 得来)
2.代码实现
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int r = 1;
scanf("%d %d", &a,&b);
while (1)
{
r = a % b;
if (r == 0)
{
printf("%d\n", b);
break;
}
a = b;
b = r;
}
return 0;
}
以上是我自己写的代码(仅供参考)。