首页 > 代码库 > 欧几里得算法--辗转相除法
欧几里得算法--辗转相除法
今天在做一个很简单的算法题目,“求最大公约数和最小公倍数”。一看,太tm容易。
思考过程是这样的:
1.最大公约数,有两个个极端,一个是最大公约数是1,一个最大公约数是两个数之间较小的那个数。
2.我就理所当然地认为,so easy。不就一个for循环吗?从较小的那个数到1的这一段范围就,如果其中一个数能被较大的数整除不就ok罗,然后返回到那个数,不就得到最大公约数啦。
3.然后兴致冲冲地写下下列的代码
public static void commonDivisor(int n,int m) { //其中n,m是所求的数字,当n%i取模等于0的时候,再判断m%i等于0的时候,i就是m和n的最大公约数 for(int i=n;i>0;i--) { if(n%i==0&&m%i==0) { System.out.println(n+"和"+m+"的最大公约数是:"+i); break; } } }
--------------------------------------------------羞耻的分割线--------------------------------------------------------------
我看到网上的答案整个人都醉了,这tm是什么意思?
public static int gcd(int m,int n) { while(true) { if((m=m%n)==0) return n; if((n=n%m)==0) return m; } }
看到这个代码,猛然发现这个是我之前学过一个数学定理---欧几里得算法(辗转相除法),可以最快得到最大公约数,具体的推导过程就不说了。http://baike.baidu.com/view/1241014.htm?fr=aladdin
以前觉得好像数学在编程的用处不是很大(原谅我其实一直菜鸟来着)。现在两段简单代码里面蕴含的思想就差别很大了。我写的是从时间复杂度是O(n),网上的是5log(N)。
一个用蛮力,一个巧用劲。
一个简单粗暴,一个站在巨人的肩上。
一个时间复杂度大,一个如此的快乐单一。
欧几里得算法--辗转相除法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。