[算法]Java实现 求两个非负整数最大公约数 循环法 递归法

来源:互联网 发布:unity3d选中物体高亮 编辑:程序博客网 时间:2024/06/06 12:56

[算法]Java实现 求两个非负整数最大公约数 循环法 递归法

代码功能:

1.Java实现(完整源码附测试用例);
2.求解两个非负整数p,q(p>=q)的最大公约数;
3.循环法 以及 递归法两种求解思路;

完整源码:

/* GCD:Greateast Common Divisor */public class GCD{    public static void main(String args[]){        /* Test Case */        int p = 32;        int q = 24;        System.out.println("The greatest divisior of "+p+" and "+q+" is \n"+            "[ gcd1 ] : "+gcd1(p,q)+"\n"+"[ gcd2 ] : "+ gcd2(p,q));    }       //  (q % gcd ==0 AND p% gcd ==0 [gcd from q to 1])     public static int gcd1(int p,int q){        int gcd=1;        int d=q;        while(d>0){            d--;            if(q%d==0 && p%d==0){                gcd = d;                break;            }        }        return gcd;    }    //  gcd(p,q)=gcd(q,p%q)[if q=0,gcd=p]    public static int gcd2(int p,int q){        if(q==0) return p;        int r = p%q;        //System.out.println("("+q+","+r+")");        return gcd2(q,r);    }}

运行截图:

求两个非负整数的最大公约数

代码解释:

循环法 gcd1(p,q)

自然语言描述 :循环法求解两个非负整数p,q(p>=q)的最大公约数,即求解q的公约数中为p的公约数的最大值。令d(被除数)从p开始递减(递减step = 1)d始终为“即将满足条件的最大值”,当d满足条件(既可以被p整除又可以被p整除时),d即p与q的公约数,d即为p、q的最大公约数;

递归法 gcd2(p,q)

自然语言描述: 递归法求解两个非负整数p,q(p>=q)的最大公约数 ,当q等于0时,最大公约数为p;否则,对p、q取余得r=p%q,p、q的最大公约数即为q、r的最大公约数;

代码心得:

  • 关于循环法,一开始我想到的是,写一个求解公约数的方法、用整型数组存储一个非负整数的全部公约数,然后比较找出p、q中共同的那个最大的公约数也就是两个数的最大公约数了,后来想想,既然是求最大,那么就直接从后往前递减岂不是更省事儿,从后往前递减就可以保证这个数一直是当前最大,因为比它大的家伙都不符合条件(能同时被p、q整除)被淘汰掉了啦,就免去了最初需要的找最大这个麻烦,虽然求最大值方法多多,但是如果自己已经或者原本就是就不需要去证明和寻找了哈哈,怎么感觉有点在说哲学 ;

  • 关于递归法,我能依靠我的直觉完全理解的还只有那句p、q的最大公约数就是q、r(r=p%q)的最大公约数这个环的开始,但是还是不太理解环的结束条件 q为0,返回p;

  • 虽然是很简单的求解最大公约数算法,但是非要用两种思路来写一下,主要还是为了再感受一下我不是很熟悉的递归法,以前看求解汉诺塔斐波那契数的递归算法那明白白的公式亮在那里,就在感慨,这完全就是数学啊!今天学习到的这个,感触居然比那时候还要震撼,不知道发生了什么问题奇妙地就解决了。我到时没太在意什么内存啊、效率之类的指标,只是觉得能想到这个的家伙真的太聪明,对他们而言计算机也好、编程语言也好,真正做到了只是解决问题的工具。有人说,递归是让人脑去思考让计算机去计算的算法,感觉真的是很贴切的说法呢。

参考资料

  • 图灵程序设计丛书:算法(第4版) 塞奇威克 (Robert Sedgewick) (作者), 韦恩 (Kevin Wayne) (作者), 谢路云 (译者)
0 0
原创粉丝点击