求两个整数的最大公约数

时间:2021-03-13 09:50:09

题目要求

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

运行结果展示:

求两个整数的最大公约数
求两个整数的最大公约数
求两个整数的最大公约数
求两个整数的最大公约数