求这两个数有个很好的算法
-> 辗转相除法(欧几里德算法)。这个好像是小学学的,不知道的建议回炉重造。
方法
用较大数除以较小数,
再用出现的余数(第一余数)去除除数,
再用出现的余数(第二余数)去除第一余数,
如此反复,直到余数为零,
最后的除数便是两数的最大公因数。
原理
有两个数a,b(a>b)设其最大公因数为k(记为gcd(a,b)),
则有a=mk,b=nk。
设r=a(mod b),即r=(m%n)k,
所以k也是r的因数。
下面来证明gcd(a,b) = gcd(b,r),
因为k是b与r的因数,只需证明(m % n)与 n互质即可。
不妨设两者不互质,则有(m%n)=ix,n=jx;
则m=(m/n * ix) + jx,则m和n有因数x,
这与a,b的最大公因数为k矛盾,
上式得证。
接下来,由递归关系我们便可以得出该算法的正确性。
代码
int gcd(int a,int b)
{
return a%b ? gcd(b,a%b) : b;
}
int lcm(int a,int b)
{
int gcd(int ,int);
return a*b/gcd(a,b);
}