最大公约数Greatest Common Divisor(GCD)
一 暴力枚举法
原理:试图寻找一个合适的整数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)的更多相关文章
- 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) ...
- LeetCode.1071-字符串最大公约数(Greatest Common Divisor of Strings)
这是小川的第391次更新,第421篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第253题(顺位题号是1071).对于字符串S和T,当且仅当S = T + ... + T ...
- upc组队赛17 Greatest Common Divisor【gcd+最小质因数】
Greatest Common Divisor 题目链接 题目描述 There is an array of length n, containing only positive numbers. N ...
- 845. Greatest Common Divisor
描述 Given two numbers, number a and number b. Find the greatest common divisor of the given two numbe ...
- [UCSD白板题] Greatest Common Divisor
Problem Introduction The greatest common divisor \(GCD(a, b)\) of two non-negative integers \(a\) an ...
- 2018CCPC桂林站G Greatest Common Divisor
题目描述 There is an array of length n, containing only positive numbers.Now you can add all numbers by ...
- CCPC2018 桂林 G "Greatest Common Divisor"(数学)
UPC备战省赛组队训练赛第十七场 with zyd,mxl G: Greatest Common Divisor 题目描述 There is an array of length n, contain ...
- 最大公约数和最小公倍数(Greatest Common Divisor and Least Common Multiple)
定义: 最大公约数(英语:greatest common divisor,gcd).是数学词汇,指能够整除多个整数的最大正整数.而多个整数不能都为零.例如8和12的最大公因数为4. 最小公倍数是数论中 ...
- hdu 5207 Greatest Greatest Common Divisor 数学
Greatest Greatest Common Divisor Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/ ...
随机推荐
- Python的numpy库下的几个小函数的用法
numpy库是Python进行数据分析和矩阵运算的一个非常重要的库,可以说numpy让Python有了matlab的味道 本文主要介绍几个numpy库下的小函数. 1.mat函数 mat函数可以将目标 ...
- SecureCRT注册机使用方法
SecureCRT_7.3注册机激活步骤如下: 1)准备工作 安装好SecureCRT软件, 下载并得到该注册机. 2)保持SecureCRT软件关闭(运行的话会提示你正在运行的,关闭就好). 3)将 ...
- 网页上下载文件提示框(vb.net)
Public Sub downLoadFile(ByVal fPath As String) Dim fileInfo As System.IO.FileInfo = New System.IO.Fi ...
- linux知识点
通过gui来使用通过api来使用通过cli来使用通过tui来使用 进程不在,但tcp连接还一直存在的解决办法--tcpkill命令 http://www.centoscn.com/CentOS/Int ...
- Android-Adapter用法总结
1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的 View(ListView,GridView)等地方都需要用到Adapter.如下图 ...
- HTTP请求方法对照表
根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELE ...
- .NET中的Timer类型用法详解
这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下 在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行 ...
- openssl与cryptoAPI交互AES加密解密
继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...
- SqlDataAdapter怎么处理事务呢
SqlDataAdapter怎么处理事务呢,没找到相关代码,哪位朋友能提供下 解决方案 » this._DBAdpt-------------SqlDataAdapterthis._DBConn- ...
- 【jmeter】基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示
本文主要讲述如何利用JMeter监听器Backend Listener,配合使用InfluxDB+Grafana展示实时性能测试数据 关于JMeter实时测试数据 JMeter从2.11版本开始,命令 ...