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

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

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


相关文章

  • 最大公因数
  • 奇偶性分析 同学们知道:能被2整除的数是偶数,不能被2整除的数称为奇数.通常偶数记为2n ,奇数记为2n+1(n 为整数).一个整数,要么是奇数,要么是偶数.这是整数的最基本的性质.一个整数是奇数还是偶数时这个数自身的属性,称为这个数的奇偶 ...查看


  • 分数的意义和性质,教材分析 1
  • <分数的意义和性质>教材分析 本单元的主要内容有:分数的意义.真分数和假分数.分数的基本性质(约分.通分).分数和小数的互化.其中分数的意义和分数的基本性质是整个单元的重点,"分数的意义和性质"和后面&quo ...查看


  • [分数的意义和性质]教材分析
  • <分数的意义和性质>教材分析 浙江省诸暨市实验小学教育集团 陈菊娣(初稿) 浙江省诸暨市教育局教研室 汤 骥(统稿) 本单元的主要内容有:分数的意义.真分数和假分数.分数的基本性质(约分.通分).分数和小数的互化.其中分数的意义 ...查看


  • 除数是两位数的除法
  • 除数是两位数的除法 A 卷 一.填空 1.两位数除三位数,商可能是( )位数,也可能是( )位数. 2.二位数除四位数,商可能是( )位数,也可能是( )位数. 3.( )×40 4.○÷□=12„„12,□最小是( ),这时○是( ). ...查看


  • 分数和小数互化练习题
  • 1分别用小数和分数表示下面的阴影部分. 2把下面的小数化成分数. 0.3= 0.25= 0.45= 1.06= 2.5= 0.375= 3把下面的分数化成小数.(不能化成有限小数的保留两位小数) 23= 35= 916= 740= 425 ...查看


  • 求最大公因数和最小公倍数的方法
  • 求最大公因数和最小公倍数的方法 一. 特殊情况: 1.倍数关系的两个数,最大公因数是较小的数,最小公倍数是较大的数.(如:6和12的最大公因数是6,最小公倍数是12.) 2.互质关系的两个数,最大公因数是1,最小公倍数是它们的乘积.(如,5 ...查看


  • 2017会计专硕数学讲义第一章,实数
  • 2017联考数学公式 第一章 算数 第一节 实数 一.数的概念和性质 1.整数和自然数 整数Z :... ,-2,-1,0,1,2,... 自然数N :0,1,2,... 正整数 Z 整数零自然数N (最小的自然数为0) 负整数 Z 2.质 ...查看


  • 最小公倍数教学案例及评析
  • 公倍数及最小公倍数 教材:公倍数及最小公倍数是青岛版小学数学第七单元第4个信息窗的内容,是学生之前学习过公因数和最大公因数的基础上进行深入学习的,并为之后分数的约分及通分打下基础. 学情:四年级的学生已经具备了一定的自学能力及学习习惯,之前 ...查看


  • 小学数学概念公式数量关系进率大全
  • 小学数学概念公式规律进率汇总 一 概念 (一)整数 1. 整数的意义 自然数和0都是整数. 2. 自然数 我们在数物体的时候,用来表示物体个数的1,2,3--叫做自然数. 一个物体也没有,用0表示.0也是自然数. 3.计数单位 一(个).十 ...查看


热门内容