辗转相除法(欧几里德算法)

辗转相除法求最大公约数

①假设a,b两个自然数,先判断a,b的大小,用a存大的,b存小的。

②a/b=q…r,把b乘到等式右边,即a=q*b+r,假设r(n)一直不等于0,会得到

b=q1*r+r1

r=q2*r1+r2

r1=q3*r2+r3

……  ……

一直到r(n)等于0,则r(n-1)为最大公约数。如,r3为0,则

r1=q3*r2,则r=q2*q3*r2+r2,即r=r2*(q2*q3+1);

所以r2是a,b的最大公约数。

代码实现

#include <iostream>
#include <cstdio>
using namespace std;

int gcd(int a,int b);
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    if(a<b){
        swap(a,b);
    }
    printf("%d
",gcd(a,b));
    return 0;
}
int gcd(int a,int b){
if(a%b!=0){
    return gcd(b,a%b);
}
else
    return b;
}

这是求最大公约数的非常高效的算法,其复杂度是O(log max(a,b))以内,不过我不是很会分析。。

既然有了最大公约数,那么就可以求出最小公倍数,最小公倍数:a*b/最大公约数

因为a/最大公约数就剩下了它最小的约数,b也是如此,所以最大公约数*a剩下的最小约数*b剩下的最小约数即为最小公倍数。

  

原文地址:https://www.cnblogs.com/LuRenJiang/p/7436437.html