更相减损法 php,求两数最大公约数 - WAITING520的个人空间 - OSCHINA - 中文开源技术交流社区...

1、普通写法

/**

* 普通写法

* @param numbera

* @param numberb

* @return

*/

public static int gcd(int numbera, int numberb){

int max = numbera >= numberb ? numbera : numberb;

int min = numbera < numberb ? numbera : numberb;

if(max%min == 0){

return min;

}

int gcd = 1;

for(int i=2; i

if(numbera%i==0 && numberb%i ==0){

gcd = i;

}

}

return gcd;

}

缺点:效率低

2、辗转相除法

/**

* 辗转相除法

* @param numbera

* @param numberb

* @return

*/

public static int EuclideanAlgorithm(int numbera, int numberb){

if(numbera == numberb){

return numbera;

}

if(numbera < numberb){

return ea(numberb,numbera);

}else{

return ea(numbera,numberb);

}

}

private static int ea(int numbera, int numberb) {

if(numbera%numberb == 0){

return numberb;

}

return EuclideanAlgorithm(numberb,numbera%numberb);

}

缺点:求模运算效率低

3、更相减损术

/**简化版

* 更相减陨术

* @param numbera

* @param numberb

* @return

*/

public static int gcdChina(int numbera , int numberb){

if(numbera == numberb){

return numbera;

}

if(numbera > numberb){

return gcdChina(numbera-numberb,numberb);

}else{

return gcdChina(numberb-numbera,numbera);

}

}

缺点:(简化版的更相减损术)减法运算较之求模运算运算次数过多

4、

/**

* 位运算,更想减陨术结合

* @return

*/

public static int gcdEaAndChina(int numbera,int numberb){

if(numbera == numberb) {

return numbera;

}

if(numbera < numberb){

return gcdEaAndChina(numberb,numbera);

}else{

int x = numbera & 1;

int y = numberb & 1;

if(x==0 && y==0){

return gcdEaAndChina(numbera>>1,numberb>>1) << 1;

}else if(x==1 && y==0){

return gcdEaAndChina(numbera,numberb>>1);

}else if(x==0 && y==1){

return gcdEaAndChina(numbera>>1,numberb);

}else{

return gcdEaAndChina(numberb,numbera-numberb);

}

}

}

确保 a>b 减少代码量

偶数时,减半运算 然后恢复   奇数时,用更相减损术   。使用位运算加快效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值