最大公约数与最小公倍数

239 阅读1分钟

最小公倍数:

解题思路:

对于a,b两个数最小公倍数来说,a可以从b中寻找到自己的倍数,或者b可以从a中寻找到到自己的倍数,但是他们的倍数一定不超过ab,因此从1开始a %b,最先出现的结果为0的数一定就是他们之间的最小公倍数,但是比如a在b中寻找自己的倍数的过程时,寻找的倍数的范围都已经超过了b或者等于b,那么b中就没有发现a的倍数,那么他们的最小公倍数就是他们的乘积

代码实现

int min(int a,int b)
{
 if(a<=0||b<=0)
   return -1;
 for(i=1;i<b;i++)
 {
   if((i*a)%b==0)
     return i*a;
 }
 return b*a;
}

使用递归算法

代码实现

int min(int a,int b)
{
  if(b==0)
    return a;
  else
    return min(b,a%b);
}

最大公约数

解题思路

采用欧几里得算法也就是辗转相除法,也就是比如a不能被b整除,那么下一次将上一次的除数作为这次的被除数,将上一次的余数作为下一次的除数,一直循环,直到他们之间的余数为0,此时的除数就是他们的最大公约数

代码实现

int max(int a,int b)
{
 int r;
 if(a<=0||b<=0)
   return -1;
 do
 {
   r=a%b;
   a=b;
   b=r;
 }while(r!=0);
 return a;
}

但是我更喜欢用递归的方法解决这类问题

代码实现

int max(int a,int b)
{
  if(a<=0||b<=0)
    return -1;
  if(a%b==0)
    return b;
  else
    return max(b,a%b);
}

可以发现这样的代码量简化了很多