辗转相除法(欧几里德算法)
辗转相除法求最大公约数
①假设a,b两个自然数,先判断a,b的大小,用a存大的,b存小的。
②a/b=q…r,把b乘到等式右边,即a=q*b+r,假设r(n)一直不等于0,会得到
b=q1*r+r1
r=q2*r1+r2
r1=q3*r2+r3
…… ……
一直到r(n)等于0,则r(n-1)为最大公约数。如,r3为0,则
r1=q3*r2,则r=q2*q3*r2+r2,即r=r2*(q2*q3+1);
所以r2是a,b的最大公约数。
代码实现
#include <iostream> #include <cstdio> using namespace std; int gcd(int a,int b); int main() { int a,b; scanf("%d%d",&a,&b); if(a<b){ swap(a,b); } printf("%d\n",gcd(a,b)); return 0; } int gcd(int a,int b){ if(a%b!=0){ return gcd(b,a%b); } else return b; }
这是求最大公约数的非常高效的算法,其复杂度是O(log max(a,b))以内,不过我不是很会分析。。
既然有了最大公约数,那么就可以求出最小公倍数,最小公倍数:a*b/最大公约数
因为a/最大公约数就剩下了它最小的约数,b也是如此,所以最大公约数*a剩下的最小约数*b剩下的最小约数即为最小公倍数。
祝你早日攒够失望,然后开始新的生活。