辗转相除法求最大公约数/最小公倍数 - 范文中心

辗转相除法求最大公约数/最小公倍数

06/02

http://blog.csdn.net/jtujtujtu/article/details/4407171

2009

参考:http://zhidao.baidu.com/question/50322580.html

辗转相除法求最大公约数:

辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至前300年。它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。它并不需要把二数作质因子分解。

证明:

设两数为a、b(b<a),求它们最大公约数gcd(a、b)的步骤如下:用b除a,得a=bq1+r1(0≤r1<b)。若r1=0,则gcd(a,b)=b;若r1≠0,则再用r1除b,得b=r1q2+r2(0≤r2<r1)。若r2=0,则gcd(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。其最后一个非零余数即为gcd(a,b)。

算法:

辗转相除法是利用以下性质来确定两个正整数 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,并返回第一步。

c/c++ 代码:

递归法:

[c-sharp]

int gcd(int a, int b)  //(a>b)

{

if(a==0 || b==0)

return 0;

int t=a%b;

if(t==0)

return b;

return gcd(b, t);

}

循环法:

[c-sharp]

int gcd(int a, int b) //a>b

{

if(a==0 || b==0)

return 0;

while(b!=0)

{

int t=a%b;

a=b;

b=t;

}

return a;

}

另:考虑大数时,需要分析可行性,由此得到一些简化方法,譬如:

若x, y均为偶数,f(x, y)= 2 * f(x/2, y/2)= 2 * f(x>>1, y>>1)

若x为偶数,y为奇数,f(x, y)= f(x/2, y)= f(x>>1, y)

若x为奇数,y为偶数,f(x, y)= f(x, y/2)= f(x, y>>1)

若x, y均为奇数,f(x, y)= f(x, x - y),

那么在f(x, y)= f(x, x - y)之后,(x - y)是一个偶数,下一步一定会有除以2的操作。

因此,最坏情况下的时间复杂度是O(log2(max(x, y))。

考虑如下的情况:

f(42, 30)= f(1010102, 111102)

= 2 * f(101012, 11112)

= 2 * f(11112, 1102)

= 2 * f(11112, 112)

= 2 * f(11002, 112)

= 2 * f(112, 112)

= 2 * f(02, 112)

= 2 * 112

= 6

根据上面的规律,具体代码实现如下:

代码清单2-16

BigInt gcd(BigInt x, BigInt y)

{

if(x

return gcd(y, x);

if(y == 0)

return x;

else

{

if(IsEven(x))

{

if(IsEven(y))

return (gcd(x >> 1, y >> 1)

else

return gcd(x >> 1, y);

}

else

{

if(IsEven(y))

return gcd(x, y >> 1);

else

return gcd(y, x - y);

}

}

}

有了最大公约数,最小公倍数则很简单了,a*b/gcd(a,b).

如有任何看法,欢迎交流:)

mosesyuan at gmail.com


相关内容

  • 分数和小数互化练习题
    1分别用小数和分数表示下面的阴影部分. 2把下面的小数化成分数. 0.3= 0.25= 0.45= 1.06= 2.5= 0.375= 3把下面的分数化成小数.(不能化成有限小数的保留两位小数) 23= 35= 916= 740= 425 ...
  • 苏教版小学各年级数学教材目录
    苏教版小学各年级数学教材目录 苏教版三年级数学上册教材目录 一.除法:整十数.两位数除以一位数:除法的验算:两位数除以一位数: 二.观察物体 三.认数:认识整千数:认识几千几百几十几 四.千克和克 五.加和减:两位数加两位数的口算:两位数减 ...
  • 最小公倍数的求法-学生版
    几个自然数的公倍数中最小的一个,叫做这几个数的最小公倍数.求几个数的最小公倍数可用下面几种方法. 一.直接法 例如:12和13互质,它们的最小公倍数就是12×13=156. 例如:100是25的倍数,那么大数100就是100和25的最小公倍 ...
  • 小学奥数知识点及公式总汇(必背)
    小学奥数知识点及公式总汇(必背) 1.和差倍问题 2.年龄问题的三个基本特征: 3.归一问题的基本特点: 4.植树问题 5.鸡兔同笼问题 6.盈亏问题 7.牛吃草问题 8.周期循环与数表规律 9.平均数 10.抽屉原理 11.定义新运算 1 ...
  • 小学数学专业基础知识
    小学数学专业基础知识 1.长方形的周长=(长+宽)×2 C=(a+b)×2 2.正方形的周长=边长×4 C=4a 3.长方形的面积=长×宽 S=ab 4.正方形的面积=边长×边长 S=a.a= a 5.三角形的面积=底×高÷2 S=ah÷2 ...
  • [最小公倍数]教学设计
    <最小公倍数>教学设计 一.活动激趣,理解概念. 师:体育课上我们都报数,今天这节课上也请大家报数(1-30),但是你还要记住自身所报的数是多少. 生:报数1.2.3...... 师:请所报数是2的倍数的同学站起来,再请所报数是 ...
  • 小学数学应用题类型及解题方法
    小学数学应用题类型及解题方法 小学数学应用题类型及解题方法 一和差问题:已知两个数的和与差,求这两个数的应用题,叫做和差问题.一般关系式有: (和-差)÷2=较小数 (和+差)÷2=较大数 例:甲乙两数的和是24,甲数比乙数少4,求甲乙两数 ...
  • 上海市预备年级(六年级)数学大纲
    初中预备上半学期 第一章:数的整除 1.1整数和整除的意义 1.2因数和倍数 1.3能被2.5整除的数 1.4素数.合数与分解素因数 1.5公因数与最大公因数 1.6公倍数与最小公倍数 第二章:分数 2.1分数与除法 2.2分数的基本性质 ...
  • 七年级上册知识点总结
    初一数学知识点总结 (初一上学期) 1.有理数: (1)正数和负数 负数:比0小的数 正数:比0大的数 ①字母a可以表示任意数,当a表示正数时,-a是负数:当a表示负数时,-a是正数:当a表示0时,-a仍是0.(如果出判断题为:带正号的数是 ...
  • 数学参考答案
    数学参考答案 1.1 生活 数学参考答案 1.1956:2:18 2.4 3.20:45 4.大 5.33 6.B 7.A 8.A 9.C 10.A 3 11.21.72km . 12.6.0kg 630000(cm) . 13.带2只备用 ...