辗转相除法

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

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

就是从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 }

 

posted @ 2016-01-28 12:51  543~  阅读(160)  评论(0编辑  收藏  举报