题目:求两个整数的最大公约数
分析:如果一个数既是数A的约数,又是数B的约数,称为A,B的公约数,A,B的公约数中最大的一个(可以包括AB自身)称为AB的最大公约数——出自百度百科。
最大公约数最原始的方法为辗转相除法,即假设f(x,y)表示x,y的最大公约数,取k=x/y,b=x%y,则x=k*y+b,如果一个数能够同时整除x和y,则必能同时整除b和y;即具有相同的公约数,其最大公约数也是相同的,则有f(x,y)=f(y,x%y)
int gcd(int x,int y)
{
return (!y)?x:gcd(y,x%y);
}
但是除法运算开销特别大,为了减小运算开销,采用减法代替除法的操作,即f(x,y)=f(y,x-y)。这种方法可以减小运算的开销,但同时增加了迭代次数。
结合上述两种方法,有了下面的解决方法。
对于x和y来说,如果y=k*y1,x=k*x2,那么有f(x,y) = k*(x1,y1)
如果x=p*x1,p为素数,且y%p!=0,那么f(x,y)=f(p*x1,y)=f(x1,y)
其中,p取2可以使得乘法与除法变成移位操作。
代码如下:
import java.util.*;
public class MaxGcd
{
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
System.out.println("Enter a number:");
int num1 = s.nextInt();
System.out.println("Enter a number:");
int num2 = s.nextInt();
int result = gcd(num1,num2);
System.out.println("max gcd:"+result);
}
public static int gcd(int a,int b)
{
if(a<b)
gcd(b,a);
if(b==0)
return a;
else
{
if(isEven(a))
{
if(isEven(b))
return(gcd(a>>1,b>>1)<<1);
else
return gcd(a>>1,b);
}
else
{
if(isEven(b))
return gcd(a,b>>1);
else
return gcd(b,a-b);
}
}
}
public static boolean isEven(int num)
{
if(num%2==0)
return true;
else
return false;
}
}