递归求杏彩源码下载论坛:haozbbs.com Q1446595067最大公约数和最小公倍数
最大公约数(GCD)
int gcd(int a, int b)
{
return a % b ? gcd(b, a % b) : b;
}
1
2
3
4
用辗转相除法求最大公约数,用递归写的代码会比循环简洁一些。
先判断a除以b的余数是否为0。
a % b ?
1
不为0的话,则继续用被除数作为除数,用上一步的余数作为除数继续运算。
a % b ? gcd(b , a%b)
1
是0的话则b就位两数的最大公约数,则返回b。
a % b ? gcd(b , a%b): b
1
注 : 这里不用考虑a 和 b的大小。如果a 小于 b, a%b 就等于 a ,则调用gcd (b, a % b)就等同于调用 gcd (b, a) , 所以无需判断是否交换。
最小公倍数 (LCM)
int lcm(int a, int b)
{
return a * b / gcd(a, b);
}
1
2
3
4
公式法,两数乘积除以最大公约数即为最小公倍数。
具体测试 :
#include<stdio.h>
#include<math.h>
int gcd(int a, int b);
int lcm(int a, int b);
int main () {
int a, b;
while(scanf("%d %d", &a, &b) != EOF)
{
printf("最大公约数:%d \n最小公倍数:%d", gcd(a, b), lcm(a, b));
}
return 0;
}
int gcd(int a, int b)
{
return a % b ? gcd(b, a%b) : b;
}
int lcm(int a, int b)
{
return a * b / gcd(a, b);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
这里写图片描述