一 暴力枚举法

  原理:试图寻找一个合适的整数i,看看这个整数能否被两个整形参数numberA和numberB同时整除。这个整数i从2开始循环累加,一直累加到numberA和numberB中较小参数的一半为止。循环结束后,上一次寻找到的能够被两整数整除的最大i值,就是两数的最大公约数。

 int getGreatestCommonDivisor(int numberA, int numberB)
 {
      ||numberB < )
     {
         ;
     }

      || numberB <= )
     {
         ;
     }

     int max = numberA > numberB ? numberA : numberB;
     int min = numberA > numberB ? numberB : numberA;

     )
     {
         return min;
     }

     ;
     ;

     ; i <= min/; i++)
     {
         ) && (numberB % i == ))
         {
             ret = i;
         }
     }

     return ret;
 }

二 辗转相除法(欧几里得算法)

  原理:两个正整数a和b(a > b),它们的最大公约数等于a除于b的余数c和b之间的最大公约数。比如10和25,25除以10余数5,那么10和25的最大公约数,等于10和5的最大公约数。然后以此类推,直到两个数可以整除,或者其中一个数减小到1为止。

  缺陷:当两个整形数较大时,a % b取模运算的性能比较低。

 int gcd(int a, int b)
 {
     )
     {
         return b;
     }
     else
     {
         return gcd(b, a%b);
     }
 }

 int getGreatestCommonDivisor(int numberA, int numberB)
 {
      ||numberB < )
     {
         ;
     }

      || numberB <= )
     {
         ;
     }

     int max = numberA > numberB ? numberA : numberB;
     int min = numberA > numberB ? numberB : numberA;

     )
     {
         return min;
     }
     else
     {
         return gcd(max, min);
     }
 }

三 更相减损术

  原理:两个正整数a和b(a > b),它们的最大公约数等于a - b的差值c和较小数b的最大公约数。

  缺陷:更相减损术的运算次数肯定远大于辗转相除法。特别是当两数相差比较大,相减的次数很大。

 int gcd(int a, int b)
 {
     if (a == b)
     {
         return a;
     }

     if (a > b)
     {
         return gcd(a-b, b);
     }
     else
     {
         return gcd(b-a, a);
     }
 }

 int getGreatestCommonDivisor(int numberA, int numberB)
 {
      ||numberB < )
     {
         ;
     }

      || numberB <= )
     {
         ;
     }

     int max = numberA > numberB ? numberA : numberB;
     int min = numberA > numberB ? numberB : numberA;

     )
     {
         return min;
     }
     else
     {
         return gcd(max, min);
     }
 }

四 辗转相除法和更相减损术相结合

  原理:当a和b均为偶数,gcb(a, b) = 2 * gcb(a/2, b/2) = 2 * gcb(a>>1, b>>1) = gcb(a>>1, b>>1) << 1

        当a为偶数,b为奇数,gcb(a, b) = gcb(a/2, b) = gcb(a>>1, b)

     当a为奇数,b为偶数,gcb(a, b) = gcb(a, b/2) = gcb(a, b>>1)

     当a和b均为奇数,先用更相减损术运算一次,gcb(a, b) = gcb(b, a-b),此时a-b是偶数,用上面的公式

  说明:移位运算的性能非常快,a/2 转换成a>>1,a * 2 = a << 1

     和1做&操作,判断奇偶:结果为真奇数,结果为假偶数

 int gcd(int a, int b)
 {
     if (a == b)
     {
         return a;
     }

     )) && (!(b&)))   // a和b均为偶数
     {
         , b>>) << ;
     }
     )) && (b&)) // a偶数,b奇数
     {
         , b);
     }
     ) && (!(b&))) // a奇数,b偶数
     {
         );
     }
     else                        // a和b均为奇数
     {
         if (a > b)
         {
             return gcd(a-b, b);
         }
         else
         {
             return gcd(b-a, a);
         }

         return gcd(a-b, b);
     }
 }

 int getGreatestCommonDivisor(int numberA, int numberB)
 {
      ||numberB < )
     {
         ;
     }

      || numberB <= )
     {
         ;
     }

     int max = numberA > numberB ? numberA : numberB;
     int min = numberA > numberB ? numberB : numberA;

     )
     {
         return min;
     }
     else
     {
         return gcd(max, min);
     }
 }

最大公约数Greatest Common Divisor(GCD)的更多相关文章

  1. Greatest common divisor(gcd)

    欧几里得算法求最大公约数 If A = 0 then GCD(A,B)=B, since the GCD(0,B)=B, and we can stop. If B = 0 then GCD(A,B) ...

  2. LeetCode.1071-字符串最大公约数(Greatest Common Divisor of Strings)

    这是小川的第391次更新,第421篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第253题(顺位题号是1071).对于字符串S和T,当且仅当S = T + ... + T ...

  3. upc组队赛17 Greatest Common Divisor【gcd+最小质因数】

    Greatest Common Divisor 题目链接 题目描述 There is an array of length n, containing only positive numbers. N ...

  4. 845. Greatest Common Divisor

    描述 Given two numbers, number a and number b. Find the greatest common divisor of the given two numbe ...

  5. [UCSD白板题] Greatest Common Divisor

    Problem Introduction The greatest common divisor \(GCD(a, b)\) of two non-negative integers \(a\) an ...

  6. 2018CCPC桂林站G Greatest Common Divisor

    题目描述 There is an array of length n, containing only positive numbers.Now you can add all numbers by ...

  7. CCPC2018 桂林 G "Greatest Common Divisor"(数学)

    UPC备战省赛组队训练赛第十七场 with zyd,mxl G: Greatest Common Divisor 题目描述 There is an array of length n, contain ...

  8. 最大公约数和最小公倍数(Greatest Common Divisor and Least Common Multiple)

    定义: 最大公约数(英语:greatest common divisor,gcd).是数学词汇,指能够整除多个整数的最大正整数.而多个整数不能都为零.例如8和12的最大公因数为4. 最小公倍数是数论中 ...

  9. hdu 5207 Greatest Greatest Common Divisor 数学

    Greatest Greatest Common Divisor Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/ ...

随机推荐

  1. Python的numpy库下的几个小函数的用法

    numpy库是Python进行数据分析和矩阵运算的一个非常重要的库,可以说numpy让Python有了matlab的味道 本文主要介绍几个numpy库下的小函数. 1.mat函数 mat函数可以将目标 ...

  2. SecureCRT注册机使用方法

    SecureCRT_7.3注册机激活步骤如下: 1)准备工作 安装好SecureCRT软件, 下载并得到该注册机. 2)保持SecureCRT软件关闭(运行的话会提示你正在运行的,关闭就好). 3)将 ...

  3. 网页上下载文件提示框(vb.net)

    Public Sub downLoadFile(ByVal fPath As String) Dim fileInfo As System.IO.FileInfo = New System.IO.Fi ...

  4. linux知识点

    通过gui来使用通过api来使用通过cli来使用通过tui来使用 进程不在,但tcp连接还一直存在的解决办法--tcpkill命令 http://www.centoscn.com/CentOS/Int ...

  5. Android-Adapter用法总结

    1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的 View(ListView,GridView)等地方都需要用到Adapter.如下图 ...

  6. HTTP请求方法对照表

    根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELE ...

  7. .NET中的Timer类型用法详解

    这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下   在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行 ...

  8. openssl与cryptoAPI交互AES加密解密

    继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...

  9. SqlDataAdapter怎么处理事务呢

    SqlDataAdapter怎么处理事务呢,没找到相关代码,哪位朋友能提供下   解决方案 » this._DBAdpt-------------SqlDataAdapterthis._DBConn- ...

  10. 【jmeter】基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示

    本文主要讲述如何利用JMeter监听器Backend Listener,配合使用InfluxDB+Grafana展示实时性能测试数据 关于JMeter实时测试数据 JMeter从2.11版本开始,命令 ...