首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 求最大公约数与最小公倍数
【标  题】:求最大公约数与最小公倍数
【关键字】:
【来  源】:http://www.cppblog.com/Winux32/archive/2006/12/04/15954.html

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

C++博客 - Charles - 求最大公约数与最小公倍数
posts - 35,  comments - 17,  trackbacks - 0
先贴点人家的教学资料


求最大公约数九法

湖南省武冈市教研室 周定武

  一、观察法

  运用能被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);
}




?

posted on 2006-12-04 09:54 Charles 阅读(79) 评论(0)  编辑 收藏 收藏至365Key 所属分类: 算法
矩阵式螺旋输出:【上一篇】
Audio in Windows Vista:【下一篇】
【相关文章】
没有相关文章
【相关评论】
没有相关评论
【发表评论】
姓名:
邮件:
随机码*
评论*
      
|  首 页  |  版权声明  |  联系我们   |  网站地图  |
CopyRight © 2004-2007 软讯网络 All Rigths Reserved.