【算法总结】数学问题-最大公约数和最小公倍数

【算法总结】最大公约数和最小公倍数

一、最大公约数(GCD:greatest common divisor

欧几里得算法:

若 a、b 全为零则它们的最大公约数不存在;若 a、b 其中之一为零,则它们的最大公约数为 a、b 中非零的那个;若 a、b都不为零,则使新 a = b;新 b = a % b,然后重复该过程。 

例4.4 最大公约数

递归代码

#include<cstdio>

int gcd(int a, int b)
{
    if (b == 0)return a;//若b为零则最大公约数为a
    else return gcd(b, a%b);//否则改为求b和a%b的最大公约数
}

int main()
{
    int a, b;
    while (scanf("%d%d", &a, &b) != EOF)printf("%d\n", gcd(a, b));
    return 0;
}

非递归代码

#include<cstdio>

int gcd(int a, int b)
{
    while (b != 0)
    {
        int t = a % b;
        a = b;
        b = t;
    }
    return a;
}

int main()
{
    int a, b;
    while (scanf("%d%d", &a, &b) != EOF)printf("%d\n", gcd(a, b));
    return 0;
}

二、最小公倍数(LCM:lowest common multiple

a、b 两数的最小公倍数为两数的乘积除以它们的最大公约数。

例4.5 最小公倍数

时间限制:1 秒  内存限制:128 兆 

题目描述

给定两个正整数,计算这两个数的最小公倍数

输入

输入包含多组测试数据,每组只有一行,包括两个不大于 1000 的正整数。 

输出

对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。 

样例输入

10 14

样例输出

70

解题代码

#include<cstdio>

int gcd(int a, int b)
{
    return b != 0 ? gcd(b, a%b) : a;
}

int main()
{
    int a, b;
    while (scanf("%d%d", &a, &b) != EOF)printf("%d\n", a*b / gcd(a, b));//求最小公倍数
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/yun-an/p/11073233.html