最大公约数&最小公倍数

最大公约数 

 链接

如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数

整除

若整数b除以非零整数a,商为整数,且余数 为零, 我们就说b能被a整除(或说a能整除b),b为被除数,a为除数,即a|b(“|”是整除符号),读作“a整除b”或“b能被a整除”。a叫做b的约数(或因数),b叫做a的倍数 

辗转相除法

又叫【欧几里德算法】

用较大的数除以较小的数,上面较小的除数和得出的余数构成新的一对数,继续做上面的除法,直到出现能够整除的两个数,其中较小的数(即除数)就是最大公约数

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*
欧几里德算法:辗转求余
原理: gcd(a,b)=gcd(b,a mod b)
当b为0时,两数的最大公约数即为a
getchar()会接受前一个scanf的回车符
*/
#include<stdio.h>
unsigned int Gcd(unsigned int M,unsigned int N)
{
    unsigned int Rem;
    while(N > 0)
    {
        Rem = M % N;
        M = N;
        N = Rem;
    }
    return M;
}
int main(void)
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("the greatest common factor of %d and %d is ",a,b);
    printf("%d\n",Gcd(a,b));
    return 0;
}

最简代码

1
2
3
4
5
6
7
8
9
10
11
12
13
# 辗转相除法<br>#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a = 211, b = 1350;
    return gcd(b,a);
}
int gcd(int x,int y)
 
{
       return y>0?gcd(y,x%y):x;
}  

最小公倍数

链接

两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。

计算方法

分解质因数法

先把这几个数的质因数写出来,最小公倍数等于它们所有的质因数的乘积(如果有几个质因数相同,则比较两数中哪个数有该质因数的个数较多,乘较多的次数)

例如: 45=3*3*5
    30=2*3*5
    不同的质因数是2。5,3是他们两者都有的质因数,由于45有两个3,30只有一个3,所以计算最小公倍数的时候乘两个3.
    最小公倍数等于2*3*3*5=90

公式法

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)×[a,b]=a×b。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。

例如:  求[18,20],即得[18,20]=18×20÷(18,20)=18×20÷2=180。

求几个自然数的最小公倍数,可以先求出其中两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。 

代码 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
 
int gcd(int a,int b);
int lcm(int a,int b);
int main(void)
{
    int m,n,result_gcd,result_lcm;
 
    printf("求两个数的最大公约数及最小公倍数?\n请输入你想计算的两个数:\n");
    scanf("%d%d",&m,&n);
    result_gcd=gcd(m,n);
    result_lcm=lcm(m,n);
    printf("最大公约数为:%d\n最小公倍数为:%d\n",result_gcd,result_lcm);
 
    return 0;
}
 
int gcd(int a,int b)
{
    int temp;
    if(a<b)
    {
//交换两个数,使大数放在a上
        temp=a;
        a=b;
        b=temp;
    }
    while(b!=0)
    {
//利用辗除法,直到b为0为止
        temp=a%b;
        a=b;
        b=temp;
    }
    return a;
}
 
int lcm(int a,int b)
{
    int temp_lcm;
    temp_lcm=a*b/gcd(a,b);//最小公倍数等于两数之积除以其最大公约数
    return temp_lcm;
}

  

 

 

 

出处:https://www.cnblogs.com/pam-sh/p/12599576.html

posted on 2021-06-17 08:59  jack_Meng  阅读(755)  评论(0编辑  收藏  举报

导航