最大公约数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/ ...
随机推荐
- Is it possible to configure PostgreSQL to automatically close idle connections?
1.use pgbouncer As new connections/transactions/statements arrive, the pool will increase in size up ...
- 安装postgreSQL出现configure:error:readline library not found解决方法
要安装 readline , readline-dev 开发包,要么使用 --without-readline 选项关闭 readline 功能. #yum install readline; #yu ...
- C++ const使用详解
1.const常量和宏常量const int max=100;#define max 100;const常量相对宏常量有两个有点:1)有类型安全检查2)占用内存空间少 2.const变量在内存中的位置 ...
- 输入n行整数,每行的个数不确定,整数之间用逗号分隔
/*===================================== 输入n行整数,每行的个数不确定. 每行内部两个数之间用逗号隔开. 例如输入数据如下: 6 1,3,5,23,6,8,14 ...
- JS-unicode编码转换
JS-unicode编码转换 <script type="text/Javascript"> var toUN = { on: function(str) { var ...
- ie8下table的colspan属性与max-with属性的显示错乱问题
今天项目测试时发现了一个table的colspan样式问题,发现colspan单元格下的的元素设置max-with后将上面的第二列单元格撑开了,导致后面单元格的内容换行,先看代码: html代码: & ...
- 由浅入深探究mysql索引结构原理、性能分析与优化 转
第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1. 简单介绍B-tree B+ tree树 2. MyisAM索引结构 3. Annode索引结构 4. MyisAM索引与Inno ...
- jQuery Mobile_公司简介
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 阅读layim代码小记,实现可以更改用户签名的方法
用layim原版的时候发现,用户的签名是不能直接修改的,如下: 其实要改也很简单,查看一下源代码,然后加一个input进去,可是,加完之后是这样的: 没关系,给它一个样式,让它乖乖的“隐藏“起来. / ...
- AR增强现实特点、关键技术和应用
http://wenku.baidu.com/link?url=ABXxm5yezMIQRJUV7XvNWUe_QpUUdpQ3IxGRpYUa760iex1_bygCcTBvEhCMvrdLAmSX ...