数学1+1:最大公约数和最小公倍数

  

数学1+1:最大公约数和最小公倍数

1 基础知识

   如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。约数和倍数都表示一个数与另一个数的关系,不能单独存在。如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数。

   “倍数是不同的两个概念,是指两个数相除的商,它可以是整数、小数或者分数。倍数只是在数的整除的范围内,相对于约数而言的一个数字的概念,表示的是能被某一个自然数整除的数,它必须是一个自然数。
 

   几个自然数,公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。例如:1216的公约数有124,其中最大的一个是441216的最大公约数,一般记为(1216=4121518的最大公约数是3,记为(121518=3


   
几个自然数公有的倍数,叫做这几个数的公倍数,其中最小的一个,叫做这几个数的最小的一个,叫做这几个数的最小公倍数。例如:4的倍数有481216……6的倍数有6121824……46的公倍数有1224……,其中最小的是12,一般记为[46]=12121518的最小公倍数是180。记为[121518]=180


2
常用结论

在解有关最大公约数、最小公倍数的问题时,常用到以下结论:


1)如果两个数是互质数,那么它们的最大公约数是1,最小公倍数是这两个数的乘积。

例如89,它们是互质数,所以(89=1[89]=72


2)如果两个数中,较大数是较小数的倍数,那么较小数就是这两个数的最大公约数,较大数就是这两个数的最小公倍数。

例如18318÷3=6,所以(183=3[183]=18


3)两上数分别除以它们的最大公约数,所得的商是互质数。

例如814分别除以它们的最大公约数2,所得的商分别为47,那么47是互质数。


4)两个数的最大公约数与它们的最小公倍数的乘积等于这两个数的乘积。

例如1216,(1216=4[1216]=48,有4×48=12×16,即(1216×[1216]=12×16


3
两个数最大公约数的求法

假设我们要求nm两个数的最大公约数,而且n >= m

3.1
逐个试探

逐个试探是最简单的办法,从最小值k=1开始,然后开始递增k的值,直到k不能被nm整除为止。代码如下:

public static int gcd( int n, int m )
{
   
int k;
   k 
= 1;
   
for(int i = 1; i <= n; i++)
   {
    
if(n % i == 0 && m % i == 0 )
     k 
= i;
   }

   
return k;
}

3.2 辗转求余

算法步骤如下:

(1)
n除以m的余数j,即j = n % m

(2)
如果j大于0n = m m = j,回到步骤3.2.1

(3)
如果j=0,那么m就是最大公约数

这是因为:两个数的最大公约数,同时是两个数的约数,也就是余数的约数。代码如下:

public static int gcd( int n, int m )
{
    
int j = n % m;

    
while( j > 0 )
    {
        n 
= m;
        m 
= j;
        j 
= n % m;
    }

    
return m;
}

3.3 递归方式

由上面的原理可以得到最大公约数的递归关系式如下:

if( m == 0 )
   gcd 
= n;
else
   gcd 
= gcd(m, n % m )

实现代码如下:

 

public static int gcd( int n, int m )
{
      
if( m == 0 ) 
          
return n;
      
else 
          
return gcd(m, n%m);
}

4 求任意多个数的最大公约数

   如果要求三个或更多的数的最大公约数,可以先求其中任意两个数的最大公约数,再求这个公约数与另外一个数的最大公约数,这样求下去,直至求得最后结果。

5
最小公倍数的求法

5.1 两个数的最小公倍数

对于两个数来说,直接参照上面的结论(4)就能得到。

5.2
求任意多个数最小公倍数

如果要求三个或更多的数的最小公倍数,可以先求其中任意两个数的最小公倍数,再求这个公倍数与另外一个数的最小公倍数,这样求下去,直至求得最后结果。 

 /******************************************************************************************
 *【Author】:flyingbread
 *【Date】:2006年12月25日
 *【Notice】:
 *1、本文为原创技术文章,首发博客园个人站点(http://flyingbread.cnblogs.com/),转载和引用请注明作者及出处。
 *2、本文必须全文转载和引用,任何组织和个人未授权不能修改任何内容,并且未授权不可用于商业。
 *3、本声明为文章一部分,转载和引用必须包括在原文中。
 ******************************************************************************************/

 

posted on 2006-12-25 21:37  Becool  阅读(1933)  评论(1编辑  收藏  举报