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;
    }



     

  • 相关阅读:
    MyBatis与Spring的整合
    Spring核心AOP(面向切面编程)
    Spring核心IoC(控制反转)
    动态SQL
    SQL映射文件
    初识MyBatis
    注解和反射
    Linux配置SVN和MemCached
    Java Web Day10
    Java Web Day9
  • 原文地址:https://www.cnblogs.com/sr1993/p/3697761.html
Copyright © 2011-2022 走看看