最大公约数(辗转相除法)
2014-02-05 00:39
621 查看
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
原理依据:
设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),则设a=mc,b=nc
第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
第三步:根据第二步结果可知c也是r的因数
第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
算法:
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:
1. 若 r 是 a ÷ b 的余数,则
gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公因子为 a。
另一种写法是:
1. a ÷ b,令r为所得余数(0≤r<b)
若 r = 0,算法结束;b 即为答案。
2. 互换:置 a←b,b←r,并返回第一步
JAVA语言的算法实现:
public static int gcd(int a, int b) {
if (a < b) {
int temp;
temp = a;
a = b;
b = temp;
}
int r = a % b;
if (r == 0)
return b;
return gcd(a, r);
}
相关文章推荐
- 求两个数的最大公约数——辗转相除法
- 辗转相除法求两个整数的最大公约数
- 【C语言】编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。(辗转相除法和常规求法)
- 最大公约数之辗转相除法
- 用辗转相除法求最大公约数
- 辗转相除法求最大公约数
- 最大公约数(辗转相除法)
- Java 辗转相除法 求两正整数最大公约数及最小公倍数
- 80x86 汇编:用辗转相除法求两个数的最大公约数
- Python基于辗转相除法求解最大公约数的方法示例
- 辗转相除法求两个整数的最大公约数
- 求两个数的最大公约数:辗转相除法
- 辗转相除法求最大公约数
- 《编程之美》---精确表达浮点数子问题---辗转相除法求取最大公约数
- Java中使用辗转相除法求最大公约数
- 最大公约数(枚举和辗转相除法)
- 辗转相除法求最大公约数
- 算法.数学.初级.求最大公约数--辗转相除法,powerbuilder powerscript实现
- 求最大公约数-辗转相除法
- 7. 最大公约数(辗转相除法)