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

    辗转反除法   

      对应公式:f(x, y) = f(y, x%y),其中x>=y>0。   

      程序实现如下:

    //其中a>=b
    public static int gcd(int a, int b) {  
            while(b != 0) {  
                int temp = a%b;  
                a = b;  
                b = temp;  
            }  
            return a;  
    }  
    

    大整数减法   

    因辗转反除法利用取模运算,计算开销大,故转换为大整数减法实现。
        对应公式:f(x, y) = f(x-y, y),其中x>=y>0。
        程序实现如下:
        int gcd2(int x, int y) { if (x < y) return gcd2(y, x); return (!y) ? x : gcd2(x - y, y); }
        位运算
        由于辗转反除法计算复杂,而大整数减法虽计算不复杂,但迭代次数太多,故分析公约数特点,利用位运算实现。
        对应公式:
        1)x,y均为偶数,f(x, y)=2*f(x/2, y/2)=f(x>>1, y>>1)<<1
        2)仅x为偶数,f(x, y)=f(x/2, y)=f(x>>1, y)
        3)仅y为偶数,f(x, y)=f(x, y/2)=f(x, y>>1)
        4)x,y均为奇数,f(x,y)=f(y, x-y)
        其中x>=y>0。
        实现程序如下:
        int gcd3(int x, int y) { if (x < y) return gcd3(y, x); if (y == 0) return x; else { if (x % 2 == 0) { if (y % 2 == 0) return (gcd3(x >> 1, y >> 1) << 1); else return gcd3(x >> 1, y); } else { if (y % 2 == 0) return gcd3(x, y >> 1); else return gcd3(x - y, y); } } }

  • 相关阅读:
    [ USACO 2007 FEB ] Lilypad Pond (Silver)
    [ USACO 2007 FEB ] Lilypad Pond (Gold)
    [ USACO 2007 OPEN ] Dining
    [ BZOJ 2134 ] 单选错位
    「APIO2018新家」
    「WC2018即时战略」
    「学习笔记」杜教筛
    「APIO2018选圆圈」
    「学习笔记」集合幂级数
    「NOIP2018」保卫王国
  • 原文地址:https://www.cnblogs.com/wxgblogs/p/5846066.html
Copyright © 2011-2022 走看看