求两数的最大公约数

来源:编程之美2.7

问题:求两数的最大公约数

//求两个数的最大公约数
public class GCD2_7 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int x=4272;
		int y=25472;
		System.out.println(gcd1(x,y));
		System.out.println(gcd2(x,y));
		System.out.println(gcd3(x,y));
	}

	//方法一,辗转相除法 f(x,y)=f(y,x%y),缺点,对于大整数取余运算开销会很大
	public static int gcd1(int x,int y){
		return (y>0)?gcd1(y,x%y):x;
	}
	//方法二,f(x,y)=f(x-y,y)(x>y) 缺点,迭代次数会比较多。如x远大于y时
	public static int gcd2(int x,int y){
		if(x<y)return gcd2(y,x);
		if(y==0)return x;
		return gcd2(x-y,y);
	}
	//方法三,结合方法二,主要是减少迭代次数
	public static int gcd3(int x,int y){
		if(x<y)return gcd3(y,x);
		if(y==0)return x;
		else{
			if(isEven(x)){
				if(isEven(y))return(gcd3(x>>1,y>>1)<<1);
				else return(gcd3(x>>1,y));
			}else{
				if(isEven(y))return gcd3(x,y>>1);
				else return gcd3(y,x-y);
			}
		}
	}

	//判断一个数是否为偶数
	private static boolean isEven(int x) {
		
		return (x&1)==0;
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值