定义:
最小公倍数:能够同时整除两个整数的最小整数。
最大公约数:能够同时被两个整数整除最大整数。
最直接算法
#include<stdio.h>
int main()
{
int n = 0;
int m = 0;
printf("请输入两个整数:");
scanf("%d%d", &n, &m);
int x = m > n ? m : n; //m和n中大的那一个
int y = m > n ? n : m; //m和n中小的那一个
int max = 0; //最大公约数
int min = 0; //最小公倍数
int i = 0;
//最大公约数
for (i = y; i >= 1; i--)
{
if (n % i == 0 && m % i == 0)
{
max = i;
break;
}
}
//最小公倍数
for (i = x; ; i++)
{
if (x % n == 0 && x % m == 0)
{
min = i;
break;
}
}
printf("%d\n", max + min);
return 0;
}
缺点:效率太低。
优化后的算法
在计算最大公因数时,使用欧几里何的算法大大简化了计算量。
在计算最小公倍数时,使用规律:m*n=最大公约数*最小公倍数。
这两个方法减小了时间复杂度。
#include<stdio.h>
int main()
{
int n = 0;
int m = 0;
printf("请输入两个整数:");
scanf("%d%d", &n, &m);
int max = 0; //最大公约数
int min = 0; //最小公倍数
//最大公约数
int c = 0;
int n1 = n; //防止在计算min时,n的值被改变
int m1 = m; // //防止在计算min时,m的值被改变
while (c=n1%m1)
{
n1 = m1;
m1 = c;
}
max = m1;
//最小公倍数
min = m * n / max;
printf("%d\n", max + min);
return 0;
}
递归求解
#include<stdio.h>
int gac(int x, int y)
{
if (x % y == 0)
{
return y;
}
else
{
gac(y, x % y);
}
}
int main()
{
int n = 0;
int m = 0;
printf("请输入两个整数:");
scanf("%d%d", &n, &m);
//最大公约数
int max = gac(n, m);
//最小公倍数
int min = m * n / max;
printf("%d\n", max + min);
return 0;
}
缺点:每次递归,函数调用消耗栈空间。