前言:m,n的最大公约数是指能够同时整除他们的最大正整数,接下来将介绍两种求解最大公因数的算法,分别是 欧几里得算法 与 连续整数检测法。
欧几里得算法:
将两个不全为0的非负整数的最大公约数用 gcd(m,n) 表示。
欧几里得算法采用的方法是重复应用 gcd(m,n) = gcd(n,m%n) (m%n表示 m 除以n的余数)等式,直到m%n等于0。
例如:gcd(60, 24) = gcd(24, 12) = gcd(12, 0) = 12
算法结构性分析:
- 如果 n = 0 ,就返回 m , 结束程序
- r = m%n,将m%n的余数赋给r;
- 将 n 赋给 m,再将r赋给n,返回第一步。
#include <stdio.h>
int main()
{
int n,m;//m,n是不全为0的非负整数
int r;
printf("请输入m,n:");
scanf("%d%d",&m,&n);
while(n!=0)
{
r = m%n;
m = n;
n = r;
}
printf("%d",m);
retur 0;
}
连续整数检测法
根据定义可知,n与m的最大公约数不会大于Min(m,n),将Min(m,n)赋值给t,然后判断t是否能同时整除m,n,若不能,将 t -1。重复上述步骤直到找到最大公约数。
算法结构性分析:
- 将Min(m,n)赋值给t;
- m 除以 t,如果余数为0,进入第三步,否则进入第四步
- n 除以 t,如果余数为0,则返回 t,结束算法;否则进入第四步
- 将 t 的值减一,返回第二步;
#include <stdio.h>
int main()
{
int n,m;//m,n是不为0的正整数
int t;
printf("请输入m,n:");
scanf("%d%d",&m,&n);
if(m>n){
t = n;
}else{
t = m;
}
while(t!=0){
if(m%t==0 && n%t==0) break;
else t--;
}
printf("%d",t);
return 0;
}
值得注意的是这里m,n的取值范围是不为0的正整数,这里m,n不能为0,为0时计算出来的结果时错误的。