题目描述如题
啥也不说了 直接上代码了 思路注释里都写了
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int x=sc.nextInt();
int y=sc.nextInt();
System.out.println(gcd4(x,y));
}
}
//方法一:辗转相除法 利用取模 缺点:取模运算代价大
public static int gcd1(int x,int y){
if(x<y)
return gcd1(y,x);
if(y==0)
return x;
return gcd1(y,x%y);
}
//方法二,利用减法 即gcd(x,y)=gcd(x,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);
}
//方法三 以上两种方法的结合
//分析:如果两个数都是偶数 gcd(x,y)=2gcd(x/2,y/2);
//如果一个是偶数 一个是奇数 则 gcd(x,y)=gcd(x/2,y)或者 gcd(x,y)=gcd(x,y/2)
//如果都是奇数,则gcd(x,y)=gcd(x-y,y)即解法二
//这样就循环次数少很多,而且上面的除以2的运算 使用位运算中右移实现
public static int gcd3(int x,int y){
if(x<y)
return gcd3(y,x);
if(y==0)
return x;
if((x&1)==0){//x是偶数
if((y&1)==0){//y是偶数
return gcd3(x>>1,y>>1)<<1;
}else
return gcd3(x>>1,y);
}else{
if((y&1)==0)
return gcd3(x,y>>1);
else
return gcd3(x-y,y);
}
}
//补充一个 循环写法 之前都是递归写的 练一下循环
public static int gcd4(int x,int y){
while(true){
if(y==0)
return x;
int temp=x%y;//蠢啊!!刚才竟然忘记了这一句
x=y;
y=temp;
}
}
}