标签:
求最大公约数,我们想想有什么方法可以求呢?
首先我先来说一下最弱智的算法:
就是从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 }
标签:
原文地址:http://www.cnblogs.com/543Studio/p/5165835.html