求最大公约数与最小公倍数

求最大公约数九法

  一、观察法

  运用能被2、3、5整除的数的特征进行观察.

  例如,求225和105的最大公约数.因为225、105都能被3和5整除,所以225和105至少含有公约数(3×5)15.因为225÷15=15,105÷15=7.15与7互质,所以225和105的最大公约数是15.

  二、查找约数法
先分别找出每个数的所有约数,再从两个数的约数中找出公有的约数,其中最大的一个
就是最大公约数.

  例如,求12和30的最大公约数.
12的约数有:1、2、3、4、6、12;
30的约数有:1、2、3、5、6、10、15、30.
12和30的公约数有:1、2、3、6,其中6就是12和30的最大公约数.

  三、分解因式法

  先分别把两个数分解质因数,再找出它们全部公有的质因数,然后把这些公有质因数相乘,得到的积就是这两个数的最大公约数.

  例如:求125和300的最大公约数.因为125=5×5×5,300=2×2×3×5×5,所以125和300的最大公约数是5×5=25.

  四、关系判断法

  当两个数关系特殊时,可直接判断两个数的最大公约数.例如,两个数互质时,它们的最大公约数就是这两个数的乘积;两个数成倍数关系时,它们的最大公约数就是其中较小的那个数.

  五、短除法

  为了简便,将两个数的分解过程用同一个短除法来表示,那么最大公约数就是所有除数的乘积.

  例如:求180和324的最大公约数.

  因为:

  5和9互质,所以180和324的最大公约数是4×9=36.

  六、除法法

  当两个数中较小的数是质数时,可采用除法求解.即用较大的数除以较小的数,如果能够整除,则较小的数是这两个数的最大公约数.

  例如:求19和152,13和273的最大公约数.因为152÷19=8,273÷13=21.(19和13都是质数.)所以19和152的最大公约数是19,13和273的最大公约数是13.

  七、缩倍法

  如果两个数没有之间没有倍数关系,可以把较小的数依次除以2、3、4……直到求得的商是较大数的约数为止,这时的商就是两个数的最大公约数.例如:求30和24的最大公约数.24÷4=6,6是30的约数,所以30和24的最大公约数是6.

   八、求差判定法

  如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60的最大公约数是6.

  
如果两个数相差较大,可以用大数减去小数的若干倍,一直减到差比小数小为止,差和
小数的最大公约数就是原来两数的最大公约数.例如:求92和16的最大公约数.92-1676,76-16=60,60-16=44,44-16=28,28-16=12,12和16的最大公约数是4,所以92和16的最大公约数就是4.

  九、辗转相除法

  当两个数都较大时,采用辗转相除法比较方便.其方法是:

  以小数除大数,如果能整除,那么小数就是所求的最大公约数.否则就用余数来除刚才的除数;再用这新除法的余数去除刚才的余数.依此类推,直到一个除法能够整除,这时作为除数的数就是所求的最大公约数.

  例如:求4453和5767的最大公约数时,可作如下除法.

  5767÷4453=1余1314

  4453÷1314=3余511

  1314÷511=2余292

  511÷292=1余219

  292÷219=1余73

  219÷73=3

  于是得知,5767和4453的最大公约数是73.

  辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数.



小学数学温习过后,先来个两个数递归版的
 

 

int  GetGCDRec( int  n,  int  m)
{
    
if (m < n)
    
{
        m 
^= n;
        n 
^= m;
        m 
^= n;
    }


    
if (n == 0)
        
return m;
    
else
        
return GetGCDRec(n, m % n);
}

辗转相除法,求一个数组中所有数的最大公约数
 

int  GetGCD( int   * arr,  int  len)
{
    
int iMax = arr[0], iCurr, iRemainder;

    
for(int i = 1; i < len; i++)
    
{
        iCurr 
= arr[i];

        
if (iMax < iCurr)
        
{
            iMax 
^= iCurr;
            iCurr 
^= iMax;
            iMax 
^= iCurr;
        }


        iRemainder 
= iMax % iCurr;

        
while (iRemainder)
        
{
            iMax 
= iCurr;
            iCurr 
= iRemainder;
            iRemainder 
= iMax % iCurr;
        }

        
        iMax 
= iCurr;
    }
//for

    
return iMax;

}

最小公倍数就是乘积除以最大公约数
 

int  GetLCM( int   * arr,  int  len)
{
    
int multiple = 1;

    
for (int i = 0; i < len; i++)
        multiple 
*= arr[i];

    
return multiple / GetGCD(arr, len);
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值