题目练习: C语言网.
题目描述
输入两个正整数m和n,求其最大公约数和最小公倍数。
输入
两个整数
输出
最大公约数,最小公倍数
样例输入
5 7
样例输出
1 35
运行代码:
最大公约数的计算可采取欧几里得算法(辗转相除法),就是代码中的gcd(最大公约数Greatest Common Divisor)函数。
其原理依据两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
详解请看:欧几里得算法
求出最大公约数后,最小公倍数更简单了,只需将两个数相乘再除以最大公倍数即得出最小公倍数。
代码如下:
#include <stdio.h>
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);//递归调用
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;//利用公式
}
int main(void){
int a,b;
scanf("%d %d",&a,&b);
printf("%d %d",gcd(a,b),lcm(a,b));
return 0;
}
我们还可以使用短除法,其中i代表两个数中较小的数,j代表较大的数。
其原理相较辗转相除法略有不同,辗转相除法是直到找到最大公约数,短除法是找出两个数之间相同的因子,并将其相乘得出最大公约数。
代码如下:
#include <stdio.h>
int main(void){
//短除法
int m,n,f;
scanf("%d%d",&m,&n);
int i=m>n?n:m,j=m>n?m:n;
int gys=1,gbs;
for(f=2;f<=i;f++){
if(i%f==0 && j%f==0){
i=i/f;
j=j/f;
gys*=f;
f=1;
}
}
gbs=gys*i*j;
printf("%d %d",gys,gbs);
return 0;
}
注意:短除法需要判断出两个数中较小的数,然后作为循环的判断条件。