求两个整数的最大公约数

来源:互联网 发布:叉烧 知乎 编辑:程序博客网 时间:2024/05/14 13:47

题目要求

从键盘输入两个整数,输出两个整数的最大公约数和最小公倍数。用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();    }}

运行结果展示:

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

0 0
原创粉丝点击