求最大公约数的相关算法
1.穷举法
从两数中较小的数开始往下遍历,依次判断,简单易懂,但耗费时间相对较长,一般不推荐。
int gcd(int n, int m) { if (n<m) { n^=m; m^=n; n^=m; } for(int i=m;;i--) { if(n%i==0&&m%i==0) return i; } }
2.欧几里得算法(辗转相除法)
两数相除求余数,将余数与两数中较小的一个相除求得余数,直至余数为0.
//辗转相除法的递归实现 int gcd(int n, int m) { if (n<m) { n^=m; m^=n; n^=m; } if (m==0) return n; return gcd(m,n%m); }
3.相减法
大数减小数,二者差值再与小数求差,直至二者相等。
int gcd(int n, int m) { if(m==n) return m; while(n!=m) { if(n>m) n-=m; else m-=n; } return m; }
另外,一般求最小公倍数可以用二者乘积除以它们的最大公约数。求多个数的最大公约数可用递归来实现:
int ngcd(int *p, int n) { if(n==1) return *p; return (gcd(p[n-1],ngcd(p,n-1))); }
学海无涯