今天学到一行代码,感觉好牛逼--------当然是老师上课讲的. 辗转相除法是求最大公约数最好的方式了吧! 辗转相除法原理我也不想多说,百度一下就可以了(基本就是用大数与小数取余,再用比余数大一点的数与余数取余, 反复直到出现余数为0,那个比0大一点的数就是最大公约数) 好了,废话不多说了------上代码 int gcd(int m, int n){ return n % m == 0 ? m : gcd(n%m, m); } 详细讲解一下: 优势是使用了递归,一直让大数与小数取余,直到出现0
求最大公约数和最小公倍数 程序分析: (1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数: (2)求最大公约数用辗转相除法(又名欧几里德算法) 辗转相除法: #include<stdio.h> int main() { int a,b,c; int raw_a,raw_b; scanf("%d %d",&a,&b); raw_a=a;raw_b=b; c=a%b; while (c!=0) { a=b;b=c; c=a%b; } p
辗转相除法用得比较多,今天Mark一下.具体做法就是:如果q和r分别是m除以n的商及余数,即m=nq+r,那么m和n的最大公约数等于n和r的最大公约数. 代码如下: public static int gcd(int m, int n) { return n == 0 ? m : gcd(n, m % n); }
辗转相除法,又称欧几里得算法.两个正整数a和b(a>b),它们的最大公约数等于余数c和较小的数b之间的最大公约数.最小公倍数=两数之积/最大公约数 #include <stdio.h>int get1(int a, int b){ if (a < b) { int c = a; a = b; b = c; } while (a%b != 0) { b = a%b; a = b; } return b;}int get2(int a,int b){ return a*b / get1