c语言 -- 递归求最大公约数和最小公倍数

递归求最大公约数和最小公倍数

  • 最大公约数(GCD)
int gcd(int a, int b) 
{
    return a % b ? gcd(b, a % b) : b;
}

用辗转相除法求最大公约数,用递归写的代码会比循环简洁一些。

先判断a除以b的余数是否为0。

     a % b ?

不为0的话,则继续用被除数作为除数,用上一步的余数作为除数继续运算。

     a % b ? gcd(b , a%b)

是0的话则b就位两数的最大公约数,则返回b。

     a % b ? gcd(b , a%b): b

注 : 这里不用考虑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);
}

公式法,两数乘积除以最大公约数即为最小公倍数。

具体测试 :

#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);
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/z944733142/article/details/80748704