首页 > 代码库 > 记一种求最大公约数的方法

记一种求最大公约数的方法

除了短除,还有下面两种方法求最大公约数,不但在数学中显得简单,而且在编程中有很好的效果

尤其是特别适合于编程。。。

先放文字说明:

1、更相减损法

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。

2、辗转相除法

欧几里德算法:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。

(看这样来说如果写代码就用递归喽?)

如果你是做数学题,可以参考下面解法:

1、更相减损法

情况1、用更相减损术求98与63的最大公约数。
解:由于63不是偶数,把98和63以大数减小数,并辗转相减:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以,98和63的最大公约数等于7。

情况2、用更相减损术求260和104的最大公约数。

解:由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。
此时65是奇数而26不是奇数,故把65和26辗转相减:
65-26=39
39-26=13
26-13=13
所以,260与104的最大公约数等于13乘以第一步中约掉的两个2,即13*2*2=52。

2、辗转相除法

例如,求(319,377):
∵ 319÷377=0(余319)
∵ 377÷319=1(余58)
∵ 319÷58=5(余29),
∵ 58÷29=2(余0),
所以答案就是29.

如果你是程序员(而且准备刷题):

推荐第二种方法:

int getGCD_PlanB(int dwValue1,int dwValue2)/* Suggested by MorningFrst Article Address: http://www.cnblogs.com/MorningFrst/p/5884696.html */{    int dwBuffer;    if(dwValue1>dwValue2)    {        dwBuffer=dwValue1;        dwValue2=dwValue1;        dwValue1=dwBuffer;        //做数值交换,使从小到大排序    }    while(dwValue1!=0)    {        dwBuffer=dwValue2%dwValue1;        dwValue2=dwValue1;        dwValue1=dwBuffer;        //反复相除,交换被除数 除数    }    return dwValue2;}

 

记一种求最大公约数的方法