对于求解这两道道例题有很多种不同的解法,比如辗转相除法,穷举法,等等,这次简单介绍一下。
求最大公约数
1.辗转相除法
辗转相除法, 又名欧几里德算法(Euclidean algorithm。 它的具体做法是:用较小数除较大数,再用出现的余数(第一个余数)去除除数,再用出现的余数(第二个余数)去除第一个余数,如此反复,直到最后余数是0为止。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int eual(int a, int b) {
int t;
while (b != 0) {
t = a % b;
a = b;
b = t;
}
return a;
}
int main() {
int a, b;
scanf("%d%d", &a, &b);
printf("eual=%d\n", eual(a, b));
return 0;
}
2.穷举法
由于a和b的最大公约数不可能比a和b中的较小者还大,否则一定不能整除它,因此,先找到a和b中的较小者min,然后从min开始逐次减1尝试每种可能,即检验min到1之间的所有整数,第一个满足公约条件的min,就是a和b的最大公约数。
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a, b, min;
scanf("%d %d", &a, &b);
min = a < b ? a : b;
while (!(a % min == 0 && b % min == 0))
{
min--;
}
printf("%d", min);
return 0;
}
求最小公倍数
1.穷举法
m和n的最小公倍数一定比m和n大,也就是说要>= m,n的较大值
找到这个最大值,并且不断的++,总能找到一个值能够同时整除m和n
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int m, n, k;
scanf("%d %d", &m, &n);
k = m > n ? m : n;
for (k;; k++)
{
if (k % m == 0 && k % n == 0)
break;
}
printf("%d", k);
return 0;
}
2.改良版的穷举法
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int m, n;
scanf("%d %d", &m, &n);
int i=1;
while(m*i % n !=0)
{
i++
}
printf("%d", m*i);
return 0;
}