zoukankan      html  css  js  c++  java
  • 最大公约数求解

    方法一:辗转相除法

    优点:代码简单,容易写。缺点:开销大,用时间多。

    代码:

    int  gcd(int a,int b)
    {
        return b==0?a:gcd(b,a%b);
    }


    方法二:二进制算法

    优点:速度快。

    主要思想:

    前提:a>b,分情况讨论:

    1.a和b均为偶数,gcd(a,b)=2*gcd(a/2,b/2);

    2.a为偶数b为奇数,gcd(a,b)=gcd(a/2,b);

    3.a和b均为奇数,gcd(a,b)=gcd(a-b,b)

    代码:

    int gcd(int a,int b)
    {
        int t=1,c,d;
        while(a!=b)
        {
            if(a<b)
                swap(a,b);
            if(!(a&1))//如果a为偶数 a&1=0
            {
                a>>=1;
                c=1;//a为偶数的标志
            }
            else
                c=0;
            if(!(b&1))//如果b为偶数 
            {
                b>>=1;
                d=1;//b为偶数的标志
            }
            else
                d=0;
            if(c&&d)//a,b都为偶数
                t<<=1;//公因子
            else if(!c&&!d//a,b都为奇数
                a-=b;
        }
        return t*a;
    }

    方法三:

    int gcd(int a,int b)
    {
        if(!a)
            return b;
        int c;
        while(b)
        {
            c=b;
            b=a%b;
            a=c;
        }
        return a;
    }



     

  • 相关阅读:
    【OpenCv/EmguCv】指针式仪表读数(二)
    合天网安实验室CTF练习赛之RE300
    Codeforces Round #527 -A. Uniform String(思维)
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/vivider/p/3697510.html
Copyright © 2011-2022 走看看