求最大公约数方法——辗转相除法

今天在写一道题目的时候需要求最大公约数,我之前找最大公约数的方法是短除法,但用代码好像不太容易实现,又发现了辗转相除法,看了好多帖子感觉不太好理解,看到了一位作者的“分块”的思想,感觉很妙,希望对大家有帮助。

首先介绍一下什么是辗转相除法

简单来说就是如果要找x和y的公约数,就先用比较大的那个数除以比较小的数(这里假设x>y)。

先用x除以y,得到的余数是z。

如果z=0,那么y就是x和y的最小公约数。如果z≠0,就将y的值赋给x,将z的值赋给y,

然后重复第一步的操作,再用y除以x,如果z=0,那么y是最小公约数,如果z≠0,就再重复以上操作,直至z=0,此时的x就是x和y的公约数

举个例子,假设x=16 y=12

先用x除以y,如果得到的余数为0,那么y就是x和y的最大公约数,这个非常好理解。这里得到的余数是4,x可以写为12+4。

我们要求的最大公约数就可以看成是找12+4和12的最大公约数,我们要把它们拆成很多个部分,最大公约数就是其中最大的部分,分块的方法就是用大的部分去除以小的部分,现在,要去看12是否可以再拆出来4这么大的部分,所以用12去除以4,得到的余数为0,此时的4就是x和y的最大公约数。x和y被拆分为4+4+4+4和4+4+4。

如果此时得到的余数不是0,就要继续去拆分,直到余数为0。

扫描二维码关注公众号,回复: 15671625 查看本文章

猜你喜欢

转载自blog.csdn.net/jiumi45/article/details/123727583
今日推荐