求两个数的最大公约数(互质算法)

如何求两个数的最大公约数?

步骤如下:

先用小的一个数除大的一个数,得第一个余数;
再用第一个余数除小的一个数,得第二个余数;
再用第二个余数除第一个余数,得第三个余数;
这样逐次用后一个数去除前一个余数,直到余数是0为止。

那么,最后一个除数就是所求的最大公约数。

注意:如果最后的除数是1,那么原来的两个数是互质数

举例:

//求75与47的最大公约数为
//用大的余小的,一直重复知道余为0。
75 % 47 = 28
47 % 28 = 19
28 % 19 = 9
19 % 9 = 1
9 % 1 == 0
所以最大公约数为1
所以他们是互质的
 
方法一:
int gys(int a,int b) {
    return b == 0 ? a : gys(b,a % b);
}

方法二:
int gys(int a,int b) {
	int c;
    while(b % a != 0){
    	c = a;
    	a = b % a;
    	b = c;
	}
	return a;
}

个数 \( M \) 和 \( N \)最大公约数 (Greatest Common Divisor, GCD),通常有几种常见的算法可以实现这一目标。最经典、应用最为广泛的当属“欧几里得算法”(也称辗转相除法)。下面我们将具体介绍该方法。 ### 辗转相除法 **原理简述** 假设给定正整数 \( m > n \),若能整除,则直接得到结果;如果不能,那么接下来用较小的那个数去除上一步的余数,继续这个过程直到能够完全整除为止,此时最后那个非零余数就是原来那对数字的最大公约数。其背后的数学依据在于: \[ gcd(m,n)=gcd(n,m\%n), 其中 \% 表示取模运算 \] 即:个数最大公约数等于其中较大数减去较小数之后所得差值与原小数值之间的最大公约数...依此类推直至某次操作后发现者可以直接互质判定结束循环获取最终答案。 #### 简单实例演示 比如计算\(m = 48\)和\(n=18\)的情况: 第一步:48 % 18 -> r(余数) = 12 第二步:将原来的除数作为新的被除数,第一次产生的余数做新除数 即18 % 12->r=6 第三步:再迭代上述步骤 12 % 6 -> r=0 因此,当我们遇到第一个余数为0的情形时停止,并确定前一次剩余下来的不是0的那个数即为所的最大公因数,在此案例里面也就是6啦! 此外还有更简洁高效的递归形式表达如下伪代码所示: ```python def gcd(m, n): if n == 0: return m else: return gcd(n, m%n) ``` 当然也可以使用Python内置库`math.gcd()`函数快速方便地完成任务。 对于更大的数据范围或者性能要较高的场景下还可以采用二进制版本的改进型算法等其他优化手段提高效率。这里不再详述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值