本题目要求读入2个正整数A和B,然后输出它们的最大公约数和最小公倍数。
输入格式:
输入在一行中给出2个不超过10000的正整数A和B。
输出格式:
对每一组输入,在一行中输出最大公约数和最小公倍数,用逗号分隔。
输入样例:
2 3
输出样例:
1,6
分析:
最大公约数和最小公倍数是数论中两个重要的概念。它们可以用来解决许多实际问题,也是编程中常见的算法题目。
最大公约数(Greatest Common Divisor,GCD)是指两个正整数中能同时整除它们的最大正整数。我们可以使用递归方式来计算:如果第二个数为0,则最大公约数是第一个数;否则递归调用函数求余数和第二个数的最大公约数。
最小公倍数(Least Common Multiple,LCM)是指能被两个正整数同时整除的最小正整数。由于最大公约数与最小公倍数之间存在乘法关系:两个数的最大公约数乘以最小公倍数等于两个数本身的乘积。所以我们可以直接利用最大公约数结果计算最小公倍数。
它们之间具有如下关系:
d(a,b) × l(a,b) = a × b
计算最大公约数和最小公倍数的一般算法如下:
C++
// 最大公约数
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a%b);
}
// 最小公倍数
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
通过递归的方式来计算两个数的最大公约数。最小公倍数则利用最大公约数和其定义关系来进行计算。
这两个概念在数论和程序设计中广泛应用。比如求分数简化、时间表规划等都可以利用它们来解决问题。
总代码如下:#include<stdio.h>
int main(){
int a,b,m,n,x;
scanf("%d %d",&a,&b);
if (a<b){
x=a;
a=b;
b=x;
}
m=a;
n=b;
while(n!=0&&m%n!=0){
x=m;
m=n;
n=x%n;
}
m=a*b/n;
printf("%d,%d",n,m);
return 0;
}