一、题目描述:
输⼊2个整数m和n,计算m和n的最⼤公约数,并打印出结果。
二、解法思路
最⼤公约数是指两个或多个整数共有约数中最⼤的⼀个。为了求出两个数的最⼤公约数,可以采⽤枚举试除法。
1.
具体来说,公约数⼀定⼩于两个数,从两个数中的较⼩值开始枚举;
2.
从⼤到⼩依次判断能否同时整除这两个数,若某个数满⾜同时整除两个数,则其为公约数;
3.
从⼤到⼩遍历找到公约数时,此数即为最⼤公约数,此时应当结束循环。
•
辗转相除法:
辗转相除法也称为欧几里得算法,是⼀种⽤来求两个正整数最⼤公约数的方法。它基于⼀个简单的数学原理:如果 a
和
b
是两个正整数,且
a>b
,则a和b的最⼤公约数等于
b
和
a%b
(
a
除以
b
所得的余数)的最大公约数。
具体的辗转相除法的步骤如下:
1.
如果
a<b
,将
a
和
b
交换。
2.
⽤
a
除以
b
,得到商
q
和余数
r
,即
a=bq+r
。
3.
如果
r
等于0,则
b
就是最⼤公约数。
4.
如果
r
不等于0,则再用
b
除以
r
,得到商
q1
和余数
r1
,即
b=rq1+r1
。
5.
重复步骤3和步骤4,直到余数等于0为⽌。
6.
最后的除数就是两个数的最⼤公约数。
假设我们已经知道a和b的最⼤公约数为
d
,即
d
是
a
和
b
的公约数,那么根据带余除法,
a =
bq + r
,那么
d
也是
b
和
r
的公约数,因为
d
能整除
a
和
b
,所以
d
也能整除
a - bq
,
即
d
也能整除
r
。
最后,通过数学归纳法证明,在辗转相除的过程中,每次都将较⼤的数除以较⼩的数取余数,余数比上⼀轮操作的被除数小,最终余数为0时,较⼩的数就是 a
和
b
的最⼤公约数。因此,辗转相除法能够正确地求出 a
和
b
的最⼤公约数。
三、参考代码:
1、枚举试除法
#define _CRT_SECURE_NO_WARNINGS
//作者:爱吃糖的boy
#include<stdio.h>
int main()
{
//计算最⼤公约数
//输⼊2个整数m和n,计算m和n的最⼤公约数,并打印出结果。
printf("输入两个整数:\n");
int a, b;
scanf("%d %d",&a,&b);
int c;
next:
if (a >= b)
{
for (int i = 1; i <= b; i++)
{
if (a % i == 0 && b % i == 0)
{
c = i;
}
}
}
else
{
int n = a;
a = b;
b = n;
goto next;
}
printf("%d\n",c);
return 0;
}
2、辗转相除法
#define _CRT_SECURE_NO_WARNINGS
//作者:爱吃糖的boy
#include<stdio.h>
int main()
{
printf("输入两个整数:\n");
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);//18 24
//辗转相除法
int k = 0;
//当n不能整除m,即k≠0,更新两个最值重复步骤计算n与m%n的最⼤公约数
while (k = m % n)
{
m = n;
n = k;
}
printf("%d\n", n);
return 0;
}
//辗转相除法递归实现 gcd(a,b)的结果为a和b的最⼤公约数
int gcd(int a, int b) {
//特判除数为0时的情况
if (b == 0) {
return a;
}
//返回b和a%b的最⼤公约数
return gcd(b, a % b);
}