方法1:暴力求解
最大公约数:
是比这两个数小于等于的数,那么先假设最大公约数是这两个数中较小的, 然后用两个数对假设的这个最大公约数去求余,没有余数则假设的数就是最大公约数;有余数则对假设的这个数去减1,再去求余,直到没有余数为止,那么那个数就是最大公约数
最小公倍数:
是比这两个数大于等于的数,那么先假设是最小公倍数这两个数中较大的, 然后用假设的数对两个数去求余,没有余数则假设的数就是最小公倍数;有余数则对假设的这个数去加1,再去求余,直到没有余数为止,那么那个数就是最小公倍数
代码如下:
//最大公约数
#include<stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
int min = (a < b) ? a : b;
while(1)
{
if (a % min == 0 && b % min == 0)
{
printf("%d", min);
break;
}
else
{
min--;
}
}
return 0;
}
//最小公倍数
#include<stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
int max = (a > b) ? a : b;
while(1)
{
if (max % a == 0 && max % b == 0)
{
printf("%d", max);
break;
}
else
{
max++;
}
}
return 0;
}
方法2:效率更高的辗转相除法(这里只是简单介绍一下)
最大公约数:
用两个数中的个对一个求余,没有余数,则最大公约数就是除数;有余数则将除数的值赋给被除数,余数的值赋给除数,继续求余,以此类推,直到没有余数,那么除数就是最大公约数。
最小公倍数:
两个数的乘积除以最大公约数就是最小公倍数
图片解释
代码如下:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &a, &b);
int m = a*b;
while (c = a % b)
{
a = b;
b = c;
}
printf("最大公因数:%d\n", b);
printf("最小公倍数:%d\n", m/b);
return 0;
}
再来介绍一下新学习的求最小公倍数的方法,个人认为简单且代码效率高
两个数a b 的最小公倍数m一定满足m=a*i=b*j;这样只要找到a*i%b==0或b*j%a==0的这个数,这个数就是最小公倍数
代码如下:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int i = 1;
while (1)
{
if (a * i % b == 0)
{
break;
}
else
{
i++;
}
}
printf("%d\n", a * i);
return 0;
}