最大公约数和最小公倍数

时间:2021-02-28 00:35:48

一、问题描述

从键盘输入两个正整数a和b,求其最大公约数和最小公倍数。

二、算法思想及代码

求最小公倍数算法:最小公倍数=两整数的乘积÷最大公约数

求最大公约数算法:

(1)辗转相除法

用较大的数除以较小的数,再用除数除以出现的余数(第一余数),接着,再用第一余数除以出现的第二余数,如此反复,直到余数为0为止,最后的除数就是这两个数的最大公约数。有两整数a和b:

  ① a%b得余数c

  ② 若c=0,则b即为两数的最大公约数

  ③ 若c≠0,则a=b,b=c,再回去执行①

例如求27和15的最大公约数过程为:    27÷15 余12,15÷12余3,12÷3余0,因此,3即为最大公约数。

#include <stdio.h>
int main(){
    int m,n,r,s;
    while(true){
        printf("input 2 integers(m n): ") ;
        scanf("%d %d", &m, &n);
        if(m==0 || n==0)
            break;
            
        if(m<n){//保证m是较大的数 
            s=m;
            m=n;
            n=s;
        }
        
        s=m*n;//保留乘积用于求最小公倍数 
         
        r=m%n;
        while(r!=0){
            m=n;
            n=r;
            r=m%n;
        }
        
        //注意,最终的公约数是最后一次的除数,最后一次的余数肯定为0 
        printf("最大公约数:%d\n", n);//最大公约数
        printf("最小公倍数:%d\n\n", s/n);//最小公倍数
    }
    
    return 0;
}

最大公约数和最小公倍数

(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即为最大公约数。

#include <stdio.h> 

int main(){ int m,n,s; while(true){ printf("input 2 integers(m n): ") ; scanf("%d %d", &m, &n); if(m==0 || n==0) break; s=m*n;//保留乘积用于求最小公倍数 while(m!=n){ if(m>n) m=m-n; else n=n-m; } printf("最大公约数:%d\n", n);//最大公约数 printf("最小公倍数:%d\n\n", s/n);//最小公倍数 } return 0; }

最大公约数和最小公倍数

(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--,再回去执行②

#include <stdio.h> 
#include <stdlib.h>

#define N 100

int gcd(int m, int n){
    int i, k; 
    for(i=2; i <= n; i++) {
        if(m%i==0 && n%i==0){
            k = i;//保存当前的约数 
            continue; 
        }        
    }
    if(k<=n && k>1)
        return k;
    else 
        return 1;
}
int lcm(int m, int n){
    int t = gcd(m,n);
    return m*n/t;
}
int main(){
    int m, n, t;
    while(true){
        printf("input 2 integers(m n): ");
        scanf("%d %d", &m, &n);
        if(m==0 && n==0)
            break;
            
        if(m < n){//保证m是较大的那个数 
            t = m;
            m = n;
            n = t;
        }
        printf("最大公约数:%d\n",gcd(m,n));//求最大公约数 
        printf("最小公倍数:%d\n\n",lcm(m,n));//求最小公倍数
    }
    
}

最大公约数和最小公倍数

 

#include <stdio.h> 

int gcd(int m, int n){
    int i, k; 
    for(i=m; i >= 2; i--) {
        if(m%i==0 && n%i==0){
            return i;
        }        
    }
    return 1;
}
int lcm(int m, int n){
    int t = gcd(m,n);
    return m*n/t;
}
int main(){
    int m,n,s,t;
    while(true){
        printf("input 2 integers(m n): ");
        scanf("%d %d", &m, &n);
        if(m==0 && n==0)
            break;

        printf("最大公约数:%d\n",gcd(m,n));//求最大公约数 
        printf("最小公倍数:%d\n\n",lcm(m,n));//求最小公倍数
    }
    
    return 0;
}

最大公约数和最小公倍数

//求最小公倍数的程序:最大公约数可以用两个数的求法递归实现,也可以先求出所有公约数,再比较得出最大值。
#include <iostream>
using namespace std;
int main()
{
    int a[5]={46,252,198,2366,3188};
    int i,n;
    for(n=1;;n++)
    {
        i=n*3188;
        if((i%46==0)&&(i%252==0)&&(i%198==0)&&(i%2366==0))
        {
            cout<<"最小公倍数是:"<<i;break;
        }    
    }    
    cin.get();
    return 0;
}

最大公约数和最小公倍数

三、求多个数的最大公约数和最小公倍数

#include <stdio.h>

/* 最大公约数 */
int gcd(int a, int b)
{
    int t;
    if(a < b)
    {
        t = a;
        a = b;
        b = t;
    }
    if(b == 0)
        return a;
    return gcd(b, a % b);
}

/* 最小公倍数 */
int lcm(int a, int b)
{
    return a * b / gcd(a, b);
}

int main(void)
{
    int n, data[100], g, l;
    int i;
    printf("数据总数为:");
    scanf("%d", &n);
    for(i = 0; i < n; ++i)
    {
        scanf("%d", &data[i]);
    }
    g = data[0];
    for(i = 1; i < n; ++i)
        g = gcd(g, data[i]);
        
    l = 1;
    for(i = 0; i < n; ++i)
        l *= data[i] / g;    //将每个数除以最大公约数,然后相乘 
    l *= g;//最后再乘以最大公约数 
    printf("最大公约数 = %d\n", g);
    printf("最小公倍数 = %d\n", l);
    return 0;
}

最大公约数和最小公倍数