求两个整数的最大公约数

题目要求

从键盘输入两个整数,输出两个整数的最大公约数和最小公倍数。用C或C++语言实现程序解决问题。
最大公约数:指两个或多个整数共有约数中最大的一个。求最大公约数有多种方法,常见的有辗转相除法,相减法,穷举法,Stein算法。
最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数。

分析

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

方法一:相减法

算法思想:

① 若a大于b,则a=a-b,
② 若a小于b,则b=b-a
③ 若a等于b,则a(或b)即为两数的最大公约数
④ 若a不等于b,则再回去执行①
⑤也就是说循环的判断条件为a != b ,直到a = b时,循环结束。

举例说明:

24和15的最大公约数过程为:
a=24,b=15
a>b 则 a = a - b = 24 - 15 = 9,b = 15
b>a 则 b = b-a = 15 - 9 = 6,a = 9
a>b 则 a = a - b = 9 - 6= 3,b=3
循环结束。

流程图:

代码展示:

这里写图片描述

#include<stdio.h>
int main()
{
    int m, n, a, b;
    while (1)
    {
    printf("使用相减法求算\n");
    printf("请输入两个整数,如(7 24):\n\t");   // a, b不相等,大数减小数,直到相等为止
    scanf_s("%d%d", &a, &b);
    m = a;
    n = b;
    if (a <= 0 || b <= 0)
        {
            printf("输入有误,请重新输入:\n\t");
            scanf_s("%d%d", &a, &b);
            m = a;
            n = b;
        }
    while (a != b)
    {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
    printf("用相减法求得两数 最大公约数为:%d\n", a);
    printf("\n\t\t 最小公倍数为:%d\n", m*n / a);
    }
    return 0;
}

运行结果展示:

用相减法求最大公约数和最小公倍数

方法二:穷举法

算法思想:

①选出a,b中最小的一个数字放到c中
②分别用a,b对c求余数,即看是否能被c整除
③直到a,b同时都能被c整除
④如不能整除,c- - (c的值减一) 继续从2开始执行
⑤也就是说该循环的判断条件为 a,b能否同时被c整除,只要有一个数不能被c整除,循环继续执行

举例说明:

9和4的最大公约数过程为:
a = 9,b = 4
将其中最小的数字赋予c,c =4
a%c = 1 ,b%c = 0 ,a,b不能同时被c整除,循环继续c– ,c = 3
a%c = 0 ,b%c = 1 ,a,b不能同时被c整除,循环继续c– ,c = 2
a%c = 1 ,b%c = 0 ,a,b不能同时被c整除,循环继续c– ,c = 1
a%c = 0 ,b%c = 0 ,a,b同时被c整除 ,循环结束。
c是a和b的最大公约数。

流程图:

这里写图片描述

代码展示:

#include<stdio.h>
int main()
{
    int m, n, a, b, c;
    while (1)
    {
        printf("使用穷举法法求算\n");
        printf("请输入两个整数,如(7 24):\n\t");
        scanf_s("%d%d", &a, &b);
        if (a <= 0 || b <= 0)
        {
            printf("输入有误,请重新输入:\n\t");
            scanf_s("%d%d", &a, &b);
        }
        c = (a > b) ? b : a;   //三目运算符,求出两数中最小值,赋给c  
        m = a;
        n = b;
    while (a%c != 0 || b%c != 0)    //找到一个数能同时被啊a,b整除,则中止循环  
        {
            c--;  //如果不满足条件,则变量自减,直到能被a,b整除
        }
        printf("用穷举法求得两数最大公约数为:%d\n", c);
        printf("\n\t\t最小公倍数为:%d\n", m*n / c);
    }

    return 0;
}

运行结果展示:

用穷举法求最大公约数和最小公倍数

方法三:辗转相除法

算法思想:

有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
④该循环的是否继续的判断条件就是c是否为0

举例说明:

求24和15的最大公约数过程为:
a=24,b=15
24÷15 余9,15÷9余6,9÷6余3,3÷3余0,因此,3即为最大公约数

流程图:

这里写图片描述

代码展示:

#include<stdio.h>
int main()
{
    int m, n, a, b, c;
    while (1)
    {
        printf("使用辗转相除法求算\n");
        printf("请输入两个整数,如(7 24):\n\t");
        scanf_s("%d%d", &a, &b);
        m = a;
        n = b;
        if (a <= 0 || b <= 0)
        {
            printf("输入有误,请重新输入:\n\t");
            scanf_s("%d%d", &a, &b);
            m = a;
            n = b;
        }
        while (b != 0)     //余数不为0,继续相除,直到余数为0 
        {
            c = a%b;
            a = b;
            b = c;
        }
        printf("用辗转相除法求得 最大公约数为:%d\n", a);
        printf("\n\t\t 最小公倍数为:%d\n", m*n / a);
    }
    return 0;
}

运行结果展示:

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

源代码:

#include <stdio.h> 
#include<stdlib.h>
void first();
void second();
void third();
void menu();
void exit();
int main()
{
    int k;
    k = 1;
    while (k)
    {
        menu();
    }
    system("pause");
    return 0;
}

//用相减法求最大公约数和最小公倍数
void first()
{
    int m, n, a, b;
    printf("使用相减法求算\n");
    printf("请输入两个整数,如(7 24):\n\t");   // a, b不相等,大数减小数,直到相等为止
    scanf_s("%d%d", &a, &b);
    m = a;
    n = b;
    if (a <= 0 || b <= 0)
    {
        printf("输入有误,请重新输入:\n\t");
        scanf_s("%d%d", &a, &b);
        m = a;
        n = b;
    }
    while (a != b)
    {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
    printf("用相减法求得两数 最大公约数为:%d\n", a);
    printf("\n\t\t 最小公倍数为:%d\n", m*n / a);
}

//用穷举法求最大公约数
void second()
{
    int m, n, a, b, c;
    printf("使用穷举法法求算\n");
    printf("请输入两个整数,如(7 24):\n\t");
    scanf_s("%d%d", &a, &b);
    if (a <= 0 || b <= 0)
    {
        printf("输入有误,请重新输入:\n\t");
        scanf_s("%d%d", &a, &b);
    }
    c = (a > b) ? b : a;   //三目运算符,求出两数中最小值,赋给c  
    m = a;
    n = b;
    while (a%c != 0 || b%c != 0)    //a,b同时能被c整除 不执行该循环  
    {
        c--;   //如果不满足条件,则变量自减,直到能被a,b整除
    }
    printf("用穷举法求得两数最大公约数为:%d\n", c);
    printf("\n\t\t最小公倍数为:%d\n", m*n / c);
}

//用辗转相除法求最大公约数和最小公倍数
void third()
{
    int m, n, a, b, c;
    printf("使用辗转相除法求算\n");
    printf("请输入两个整数,如(7 24):\n\t");
    scanf_s("%d%d", &a, &b);
    m = a;
    n = b;
    if (a <= 0 || b <= 0)
    {
        printf("输入有误,请重新输入:\n\t");
        scanf_s("%d%d", &a, &b);
        m = a;
        n = b;
    }
    while (b != 0)     /* 余数不为0,继续相除,直到余数为0 */
    {
        c = a%b;
        a = b;
        b = c;
    }
    printf("用辗转相除法求得 最大公约数为:%d\n", a);
    printf("\n\t\t 最小公倍数为:%d\n", m*n / a);
}
void menu()  //主界面
{
    int num;
    printf("  \n\t************************************************** \n");
    printf("        *    求两数最大公约数和最小公倍数的三种算法      * ");
    printf("  \n\t**************************************************\n\n");
    printf("          ----------------------   ----------------------   \n");
    printf("                          * 1.相减法                    \n\n");
    printf("                          * 2.穷举法                      \n\n");
    printf("                          * 3.辗转相除法               \n\n");
    printf("                          * 4.退出计算                    \n");
    printf("          ----------------------   ---------------------- \n\n");
    printf("请选择编号1—4:");
    scanf_s("%d", &num);
    switch (num)
    {
    case 1:first(); break;
    case 2:second(); break;
    case 3:third(); break;
    case 4:exit(); break;
    default:printf("\n\n\t\t输入错误,请在1—4之间选择\n");
    }
}
void exit()
{
    printf("\n\t确定退出系统请直接按回车,否则继续在1—3中选择返回主菜单");
    getchar();
    if (getchar() == '\n')
    {
        printf("谢谢使用");
        exit(0);
    }
    else
    {
        menu();
    }
}

运行结果展示:

相减法
穷举法
辗转相除法
退出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值