zoukankan      html  css  js  c++  java
  • 辗转相除法(欧几里德算法)

    辗转相除法求最大公约数

    ①假设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剩下的最小约数即为最小公倍数。

      

  • 相关阅读:
    1,巡检脚本pexpect
    Cisco胖AP配置上网
    阿里云服务器更换密钥后,无论以何种远程连接方式都连接不上
    [PAT乙级题解]——A+B和C
    研究ThreadLocal类
    Java的反射机制
    volatile浅析
    Java 对称数据加密AES
    Java使用非对称数据加密RSA
    练习-登陆接口
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7436437.html
Copyright © 2011-2022 走看看