辗转相除法求最大公因数

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;
}

以上是我自己写的代码(仅供参考)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值