如何求两个数的最大公因数和最小公倍数呢?这个题目是灵活应用运算关系符的典型例题,开拓解决问题的思维方式,下面来看看是怎么做的吧!
1.方法一
(1)思路:遍历1到n1或者n2(取决于两个数的大小)中的每个数,如果这个数对n1,n2取余都是0,那么将这个数赋值给gcd变量。
#include <stdio.h>
int main()
{
int n1, n2, i, gcd;
printf("输入两个正整数,以空格分隔: ");
scanf("%d %d", &n1, &n2);
for(i=1; i <= n1 && i <= n2; ++i)
{
// 判断 i 是否为最大公约数
if(n1%i==0 && n2%i==0)
gcd = i;
}
printf("%d 和 %d 的最大公约数是 %d", n1, n2, gcd);
return 0;
}
(2)分析:这种方法要把小于较小值的所有的数字都遍历一遍,复杂度较高。
2.方法二
(1)思路:这个算法的数学原理我不清楚,如果有知道的评论告诉我哦!我把步骤写下来:例如输入16和4
- 第一次循环:n1 = 16,n2 = 4
- 第二次循环:n1 = 12,n2 = 8
- 第三次循环:n1 = 4 ,n2 = 8
- 第四次循环:n1 = 4 ,n2 = 4
#include <stdio.h>
int main()
{
int n1, n2;
printf("输入两个数,以空格分隔: ");
scanf("%d %d",&n1,&n2);
while(n1!=n2)
{
if(n1 > n2)
n1 -= n2;
else
n2 -= n1;
}
printf("GCD = %d",n1);
return 0;
}
3.方法三
(1)思路:这个算法被称为辗转相除法,也叫欧几里得算法,数学原理请参见:https://blog.csdn.net/xinanbo/article/details/113356018
#include <stdio.h>
int main()
{
int a,b;
int t;
scanf("%d %d", &a, &b);
while (b !=0 ){
t = a%b;
a = b;
b = t;
printf("a=%d b=%d t=%d\n",a , b, t);
}
printf("最大公约数是%d\n", a);
return 0;
}
4.方法四
递归的方式实现,我这里就不多写了,可以自己试着写一下。
5.最小公倍数
我这里只给出一个公式,两个数的积 = 最大公因数 * 最小公倍数