getGreatestCommonDivisor
来源:互联网 发布:sql server2005企业版 编辑:程序博客网 时间:2024/05/29 14:54
求两个数的最大公约数
求两个数的最大公约数有三个方法:
1.辗转相除法;
2.更相减损术;
3.更相减损术与移位相结合;
一.辗转相除法
又名欧几里得算法,目的是求出两个正整数的最大公约数,它是已知的最古老的算法,其可追溯至公元前300年前
这条算法基于一个定理: 两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数.
比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数.
//方法入口public static int getGreatestCommonDivisor(int numberA,int numberB){ int result = 1 ; if(numberA>numberB){ result=gcd(numberA,numberB); }else{ result = gcd(numberB,numberA); } return result;}//递归计算最大公约数private static int gcd(int a,int b){ if(a%b==0){ return b; }else{ return (b,a%b); }}
二.更相减损术
出自中国古代的《九章算术》,也是一种求最大公约数的算法.
原理:两个正整数a和b(a>b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数.
比如10和25,25减10的差是15,那么10和25的最大公约数,等同于10和15的最大公约数
public static gcd(int numberA,int numberB){ if(numberA==numberB) { return numberA; }else if(numberA<numberB){ return gcd(numberB-numberA,numberA); }else{ return gcd(numberA-numberB,numberB); }
三.更相减损术和移位法结合
public static int gcd(int numberA,int numberB){ if(numberA==numberB){ return number; }else if(numberA<numberB){ //保证参数A永远大于B return gcd(numberB,numberA) }else{ //和1做按位运算,判断奇偶 if(numberA&1==0&&numberB&1==0){//AB都为偶数 return gcd(numberA>>1,numberB>>1)<<1; }else if(numberA&1==0&&numberB&1==1){//A为偶数,B为奇数 return gcd(numberA>>1,numberB); }else if(numberA&1==1&&numberB&1==0){//A为奇数,B为偶数 return gcd(numberA,numberB>>1); }else{//AB都为奇数,做一次更相减损,使得A-B为偶数 return gcd(numberB,numberA-numberB); }}
阅读全文
0 0
- getGreatestCommonDivisor
- c++中位函数
- 进程通信程序管理---共享内存和信号量(Linux)
- python学习笔记 暂停一段时间
- rxjs基础知识
- eclipse maven项目用tomcat启动报错 java.lang.ClassNotFoundException
- getGreatestCommonDivisor
- C++中的constexpr关键字
- django 快速入门
- POJ
- CookiePATH的设置
- 【CSS】关于CSS盒子模型中的溢出处理方式overflow属性
- 静态对象的实现
- FLASH位宽为8、16、32时,CPU与外设之间地址线的连接方法
- 爬取1024网站的图片