这是《小白C语言编程实战》系列的第17篇。
上一篇:小白C语言编程实战(16):统计4门课的优秀率和不及格率
题目
求任意两个正整数的最大公约数(Least Common Multiple)和最小公倍数(Greatest Common Divisor),要求定义两个函数:
(1)函数int gcd(int x, int y)
求两个正整数的最大公约数,函数返回最大公约数;
(2)函数int lcm(int x, int y)
求两个正整数的最小公倍数(要求自己设计算法,不能利用下面关系计算最小公倍数:最大公约数x最小公倍数=两个数乘积 ),函数返回最小公倍数。
在主函数中输入任意两个正整数,调用上述函数求解,然后输出结果。
要求
输入输出格式示例:
输入:
18 32
输出:
6,90
提示
- 求最大公约数可以通过一条性质递归求解:
gcd(x,y) = gcd(x%y,y)
(这里假设设x>y)
若果x=y,此时x%y=0,最大公约数就是x或者y本身。
- 最小公倍数因为不能用
lcm(x,y)*gcd(x,y) = x*y
公式来求解,因此考虑逐其他办法。
参考代码
#include <stdio.h>
#include <stdlib.h>
/**
求任意两个正整数的最大公约数
*/
int gcd(int x, int y) {
if(y == 0) {
return x;
} else if(x>=y) {
return gcd(y, x%y);
} else {//x<y
return gcd(x, y%x);
}
}
/**
求任意两个正整数的最小公倍数
*/
int lcm(int x, int y) {
if(x==y) {
return x;
} else if(x<y) {
int t = x;
x = y;
y = t;
}
// 上面保证了x>y
int i, sum = 0;
for(i=1;i<=y;i++) {
sum += x;
if(sum%y == 0) {
return sum;
}
}
return 0;
}
/**
主函数
*/
int main(int argc, char *argv[]) {
int x, y;
scanf("%d%d", &x, &y);
printf("%d,%d", gcd(x,y), lcm(x,y));
return 0;
}