1、 int func(int m,int n)
{
if(m%n==0)
return n;
else return func(n,m%n);
}
求func(2012,2102);
这个递归程序实际上是示m和n的最大公约数。
上面的程序和下面的程序是等价的:
int func(int m,int n)
{
return (!n)?m:func(n,m%n);
}
(求m,n的最大公约数)
该程序的设计思想是求m和n(m>n)的最大公约数转化为求n和m%n的公约数。证明如下:设m%n=k,则m=nt+k,其中t为整数,设m n的最大公约数为p,则m/p=(nt+k)/p,因为p是m和n的最大公约数,那么m/p,n/p肯定是整数,所以k/p肯定也是整数,所以p也是k的最大公约数,所以求m和n(m>n)的最大公约数转化为求其中一个小数的和m%n的公约数,可用上述两种方法实现。或者这样理解:求两个数的最大公约数,那么这两个数肯定可以被最大公约数整除,也就是说,可以把这两个数分别分成不同的份数,每一份的大小是最大公约数的大小,一个数对另一个数取余的时候,剩下的那部分,还是可以被分成很多份,每份大小是最大公约数的大小,这样循环很多次,最后就剩下一份了,这一份就是最大公约数了
如何求两个数的最小公倍数呢?
m