多种方法求最大公约数+求最小公倍数

本文将给出求两个数a和b的最大公约数的几种可行方法。

方法一:辗转相除法

算法分析:有两个数a和b,用辗转相除法。

不妨设a>b,

首先求a和b的余数,b赋值给a,余数赋值给b;

重复以上操作,直到余数为0;

b值即为两数的最大公约数。

代码:

 1 int zdgys(int a,int b)
 2 {
 3   int temp;
 4   if( a<0 )  a=-a;
 5   if( b<0 )  b=-b;
 6   if( a<b )  {  temp=a;a=b;b=temp; }  // 让a>b
 7   if( b==0 )  return a;
 8
 9   while( a%b!=0 )   //辗转相除
10   {
11       temp=a%b;
12       a=b;
13       b=temp;
14   }
15   return b;  //最大公约数为b
16 }


方法二:

算法分析:两个数a和b的公约数与a-b和b的公约数是相同的,最大公约数也是相同的。

例如:函数 int func(int a,int b) 是求a和b的最大公约数,参数a和b,返回值为要求的最大公约数。

根据以上的分析,func(42,30) = func(30,12) = func(18,12) = func(12,6) = func(6,6) = func(6,0) =6.

求得的6即为42和30的最大公约数。

代码:

1 int  gcd(int a,int b)
2 {
3   if( a<b )
4      return gcd(b,a);   //保证a始终大于b(a>b)
5   if( 0==b )              //递归函数的终止条件
6    return a;
7   else
8     return gcd(a-b,b);
9 }


方法三:
算法分析:1.若X=2*X1,Y=2*Y1,则F(X,Y)=2*F(X>>1,Y>>1);

2.若X=2*X1,Y!=2*Y1,则F(X,Y)=2*F(X>>1,Y);

3.若X!=2*X1,Y=2*Y1,则F(X,Y)=2*F(X,Y>>1);

4.若X!=2*X1,Y!=2*Y1,则F(X,Y)=2*F(Y,X-Y)。

代码:

 1 int gcd(int a,int b)
 2 {
 3   if( a<b )
 4      return gcd(b,a);
 5   if( 0==b )
 6      return a;
 7   else
 8   {
 9        if( IsEvent(a) )     //IsEvent(a)  满足a=2*a1(a1=a>>1)
10        {
11              if( IsEvent(b) )
12                   return ( gcd(a>>1,b>>1) <<1 );   // → 2*gcd(a/2,b/2)
13              else
14                   return gcd(a>>1,b);      //→ gcd(a/2,b)
15        }
16       else
17       {
18              if( IsEvent(b) )
19                   return gcd(a,b>>1);   //→ gcd(a,b/2)
20              else
21                   return gcd(b,a-b);      //→ gcd(b,a-b)
22       }
23   }
24 }


附加:求两个数a和b的最小公倍数

分析:a和b的最小公倍数等于这两个数的乘积除以这两个数的最大公倍数。

代码:

1 int zxgbs(int a,int b)
2 {
3     if( 0==b )   return a;
4     if( 0==a )   return b;
5     return (a*b)/zdgys(a,b);   //zdgys(a,b)→求a和b 的最大公约数
6 }
时间: 2024-10-11 04:22:39

多种方法求最大公约数+求最小公倍数的相关文章

求最大公约数和最小公倍数

学习C++入门级的题目,求最大公约数和最小公倍数,这里介绍两种求最大公约数的方法,即辗转相除法和辗转相减法.辗转相除法的原理自行百度,辗转相减法的原理就是只要两数不想等就用大数减小数,直至相等,求最小公倍数的方法就是用两数的乘积除以最大公约数. #include<iostream> using namespace std; int maxf(int a,int b)//辗转相减法 { while(a != b) { if(a > b) return a = a - b; else ret

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

求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因为 a=m*i; b=m*j; 最小公倍数为 m*i*j 那么,下面就开始计算a和b的最大公约数. 更相损减法: <九章算術·方田>作分數約簡時,提到求最大公因數方法:反覆把兩數的較大者減去較小者,直至兩數相等,這數就是最大公因數.這方法除了把除法換作減法外,與輾轉相除法完全相同.例如書中求91和

奇葩的求最大公约数、最小公倍数、分解质因数的做法(C语言)

奇葩的求最大公约数.最小公倍数.分解质因数的做法(C语言) 1 /* 2 最奇葩的求最大公约数与最小公倍数 3 create by laog 4 time 2017年7月27日12:23:14 5 */ 6 7 //两个数的最大公约数 8 //两个数的最小公倍数 9 //将一个正整数分解质因数 --和 2.3.5取余 10 11 #include <stdio.h> 12 13 int main1() 14 { 15 // 3,4 16 //20 17 int v; 18 scanf(&quo

辗转相除法求最大公约数和最小公倍数分析

求最大公约数和最小公倍数 程序分析: (1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数: (2)求最大公约数用辗转相除法(又名欧几里德算法) 辗转相除法: #include<stdio.h> int main() { int a,b,c; int raw_a,raw_b; scanf("%d %d",&a,&b); raw_a=a;raw_b=b; c=a%b; while (c!=0) { a=b;b=c; c=a%b; } p

最简单的求最大公约数和最小公倍数的方法

public class Main{  /**   * @param args   */  public static void main(String[] args) {   // TODO Auto-generated method stub   Scanner scan = new Scanner(System.in);   int n,m;   while(scan.hasNext()){    n = scan.nextInt();    m = scan.nextInt();    

求最大公约数与最小公倍数

求两正整数的最大公约数,用辗转相除法. 1 #include<assert.h> 2 3 #define swap(a,b,type) do{ type t; t=a; a=b; b=t; }while(0) 4 5 int gcd(int a,int b) 6 { 7 int t; 8 assert(a>0&&b>0); 9 10 if(a<b) 11 swap(a,b,int); 12 while(b) 13 { 14 t=a%b; 15 a=b; 16

C语言——求最大公约数及最小公倍数

基本概念 最小公倍数:两个或多个整数公有的倍数叫做它们的公倍数.整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号. 最大公约数:也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号. 关于最小公倍数与最大公约数,我们有这样的定理:(a,b)[a,b]=ab(a,b均为整数). 方法分析 最大公

【辗转相除法】求最大公约数和最小公倍数

#include<stdio.h>  void main()   /*  辗转相除法求最大公约数 */   {      int m,n,a,b,t,c;      scanf("%d%d",&a,&b);     m=a;    n=b;     while(b!=0)  /* 余数不为0,继续相除,直到余数为0 */      {    c=a%b;    a=b;     b=c;   }     printf("%d\n", a)

求最大公约数与最小公倍数and输出锥形图案

1:描述:用Python求两个数的最大公约数与最小公倍数.(注意输入的俩个数在正整数范围内) code(代码): a=eval(input('请输入第一个整数:')) b=eval(input('请输入第二个整数:')) c=1 d=a*b if(a<=0 or b<=0): print('输入有误') else: if(a<b): c=a a=b b=c while(c!=0): c=a-b if(c==0): break else: if(c>b): a=c else: a=b

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

要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } 代码: int gongyue() { int yushu,a,b; while(b) { yushu=a%b; a=b; b=yushu; } return b; } 此子函数可以求出两个数的最大公约数n    最小公倍数为a*b/n: