【每天学点算法题10.15】求两个数的最大公约数

来源:互联网 发布:房子平面图设计软件 编辑:程序博客网 时间:2024/06/06 05:03

问题描述:求两个数的最大公约数。

解决办法之一:我们可以使用经典的碾转相除法,如果用f(x,y)表示两个数x和y的最大公约数,那么f(x,y)=f(y,x%y),即我们可以把两个数的最大公约数问题转换成两个更小的数的最大公约数,直到其中一个数变为0,剩下的那个数就是原先两个数的最大公约数。如,f(45,30)=f(30,15)=f(15,0),最大公约数为15。java示例代码如下。


public class myDivisor{public static void main(String[] args){int x=45;int y=30;System.out.println(getDivisor(x,y));}public static int getDivisor(int x,int y){int temp;while(y>0){temp=x;x=y;y=temp%y;
getDivisor(x,y);}return x;}}

解决办法之二:在解法之一中,我们在碾转相除中使用取余的操作,如果数值比较大,那么这个开销也将随之增大。如果一个数能同时整除x,y,那么这个数必然也能整除y,x-y。即f(x,y)=f(y,x-y)。这样我们就可以避免开销比较大的取余运算。在实际操作中,如果x<y,那么我们先交换x,y的位置。如f(42,30)=f(30,12)=f(18,12)=f(12,6)=f(6,6)=f(6,0)。java示例代码如下。


public class myDivisor{public static void main(String[] args){int x=42;int y=30;System.out.println(getDivisor(x,y));}public static int getDivisor(int x,int y){if(x<y){return getDivisor(y,x);}if(y==0){return x;}elsereturn getDivisor(y,x-y);}}


原创粉丝点击