最大公约数与最小公倍数算法整理

最大公约数:能够同时被两个数整除的那个最大的数

最小公倍数:两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数。

最小公倍数=两整数的乘积÷最大公约数 反之同理。

最大公约数算法:

1.GCD算法(欧几里得算法):

定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数。最大公约数(greatest common divisor)缩写为gcd。

gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)

 1 int gcd(int a,int b)
 2 {
 3     int r;
 4     while(b>0)
 5     {
 6          r=a%b;
 7          a=b;
 8          b=r;
 9     }
10     return a;
11 }  

以上是GCD算法的基础模运算实现,即辗转相除法。

位运算计算:

1 int gcd(int a,int b)
2 {
3     while(b^=a^=b^=a%=b);
4     return a;
5 }  

递归方式实现:

1 int gcd(int a,int b)
2 {
3     return (b>0)?gcd(b,a%b):a;
4 }  

2.相减法:

有两整数a和b:

① 若a>b,则a=a-b

② 若a<b,则b=b-a

③ 若a=b,则a(或b)即为两数的最大公约数

④ 若a≠b,则再回去执行①

例如求27和15的最大公约数过程为:

27-15=12( 15>12 ) 15-12=3( 12>3 )

12-3=9( 9>3 ) 9-3=6( 6>3 )

6-3=3( 3==3 )

因此,3即为最大公约数

1   /* a, b不相等,大数减小数,直到相等为止。*/
2    while ( a!=b)
3          if (a>b)  a=a-b;
4          else  b=b-a;  

3.穷举法


穷举法,即暴力算法,

有两整数a和b:

① i=1

② 若a,b能同时被i整除,则t=i

③ i++

④ 若 i <= a(或b),则再回去执行②

⑤ 若 i > a(或b),则t即为最大公约数,结束

改进:

① i= a(或b)

② 若a,b能同时被i整除,则i即为最大公约数,

结束

③ i--,再回去执行②

有两整数a和b:

① i=1

② 若a,b能同时被i整除,则t=i

③ i++

④ 若 i <= a(或b),则再回去执行②

⑤ 若 i > a(或b),则t即为最大公约数,结束

改进:

① i= a(或b)

② 若a,b能同时被i整除,则i即为最大公约数,

结束

③ i--,再回去执行②

1 /*穷举法求最大公约数*/
2 for (t= a; t>0; t-- )
3     if ( a%t == 0 && b%t ==0 )
4     break; 
1     /*穷举法求最小公倍数*/
2      for (i= a; ; i++ )
3          if ( i % a == 0 && i % b ==0 )
4          break;  
时间: 2024-10-26 20:33:27

最大公约数与最小公倍数算法整理的相关文章

最大公约数、最小公倍数算法

#include <iostream> using namespace std; //举例: // 2 | 8 6 // ---------- // 4 3 // 所以:gcd=2,lcm=2*4*3=24 //求最大公约数:辗转相除法 // 1. a ÷ b,令r为所得余数(0≤r<b) // 若 r = 0,算法结束:b 即为答案. // 2. 互换:置 a←b,b←r,并返回第一步 int gcd1(int m, int n) { int r; while(n) { r = m %

最大公约数和最小公倍数算法

// 最大公约数算法 // 1. a % b 进行取余运算 // 2. 将被取余数与余数进行再次取余运算 // 3. 直到a % b为0时停止取余运算 // 4. 将取余为0时的被取余数返回即是最大公约数 function gcd(a, b) { if (b === 0) { return a; } return gcd(b, a % b); } // 求多个数的最大公约数 const empsColumns = { Salary: [40000, 50000, 44000, 55000, 62

C语言求最大公约数和最小公倍数算法

其算法过程为:前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数 1.大数放a中.小数放b中: 2.求a/b的余数: 3.若temp=0则b为最大公约数: 4.如果temp!=0则把b的值给a.temp的值给b: 5.返回第第二步: #include <stdio.h> #include <math.h> void main(){ int divisor(int a,int b); int multiple(int a,int b); printf("The

最大公约数和最小公倍数算法实现

最大公约数 1. 用最基本的循环遍历的方法 2. 用辗转相除法 3. 用辗转相减法 See also:  http://baike.baidu.com/view/47637.htm 1 #include<iostream> 2 using namespace std; 3 4 int CommonDivisor( int x, int y); 5 int CommonMultiple(int x, int y); 6 int CommonDivisor1( int x, int y); 7 i

常见算法:C语言求最小公倍数和最大公约数三种算法

最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b=c,再回去运行① 比如求27和15的最大公约数过程为: 27÷15 余1215÷12余312÷3余0

C语言求最小公倍数和最大公约数三种算法(经典)

把以前写的一些经验总结汇个总,方便给未来的学弟学妹们做个参考! --------------------------永远爱你们的:Sakura 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两

一步一步写算法(之 最大公约数、最小公倍数)

原文:一步一步写算法(之 最大公约数.最小公倍数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 求解最小公倍数和最大公约数是我们开始编程的时候经常需要练习的题目.从题面上看,好像我们需要求解的是两个题目,但其实就是一个题目.那就是求最大公约数?为什么呢?我们可以假想这两个数m和n,假设m和n的最大公约数是a.那么我们可以这样写: m = b *a: n = c * a; 所以m和n的最小公倍数就应该是a*b*c啊,那不就是m * n

一天一个算法:求俩个数的最大公约数和最小公倍数

求俩个数的最大公约数和最小公倍数 解答: 当较大数除以较小数余数等于0时,较小数为最大公约数. 两数相乘结果除以它们的最大公约数为最小公倍数. int cdivisor(int x1,int y1) { int r,temp; if (x1<y1) { temp =x1; x1 = y1; y1 = temp; } while(x1%y1)//当较大数除以较小数余数等于0时,较小数为最大公约数 { r=x1%y1; x1=y1; y1=r; } return y1; } int cmultipl

C语言之基本算法10—最大公约数和最小公倍数

/* ================================================================== 题目:求两个数的最大公约数和最小公倍数. ================================================================== */ #include<stdio.h> main() { int m,n,r,t,j,q; printf("输入两整数:\n"); scanf("%d