辗转相除法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了辗转相除法相关的知识,希望对你有一定的参考价值。

求最大公约数,我们想想有什么方法可以求呢?

首先我先来说一下最弱智的算法:

就是从1开始试,试来试去的就搞出来了……

代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int m,n,j;
 6     cin>>m>>n;
 7     for(int i=1;i<m;i++)
 8     if(m%i==0 && n%i==0)j=i;
 9     cout<<j;
10 }

这种方法太low了……小学生都会啊……

时间复杂度还是挺高的,对于大数的公约数就没法求了,所以我们想想还有什么方法求

一般a、b的最大公约数用int gcd(int  a,int b)来表示

如果我们想求gcd(a,b),我们可以求gcd(b,a%b),这样可以很快的缩小数据范围,因为gcd(a,b)=gcd(b,a%b)啊……多好的算法!!!

1、证明:设等式a/b=t……a%b(a,b,t,a%b∈Z*),则t*b+a%b=a

            设a,b最大公约数为c

            ∴t*b含有因数c,a含有因数c

            ∴a%b中含有约数c,证毕

2、做法:任取两正整数进行辗转相除,至有一数等于0时返回最大公约数

3、时间复杂度:粗略估计O(log max(a,b))

下面直接上代码,递归想想就好了……

1 int gcd(int a,int b)
2 {
3     if(b==0) return a;
4     else return gcd(b,a%b);
5 }

 

以上是关于辗转相除法的主要内容,如果未能解决你的问题,请参考以下文章

辗转相除法求最大公约数------一行代码

辗转相除法求最大公约数c语言代码

(C++)一行代码递归实现辗转相除法

两行代码求解C语言最大公约数

SQL如何做除法

整数除法的解释——C代码