如何用C++求两个数的最大公约数和最小公倍数

我们可以使用以下两种方法求出两个数的最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)。

方法一:欧几里得算法

欧几里得算法又称辗转相除法,基本原理是:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

对于两个正整数a、b(a>b)我们有:

$gcd(a,b)=gcd(b,a\mod b)$

当$a\mod b$等于0时,返回b。

下面是C++代码实现:

#include <iostream>
using namespace std;

// 欧几里得算法求最大公约数
int gcd(int a, int b)
{
    if (b == 0)
        return a;
    return gcd(b , a % b); // 递归调用
}

// 最小公倍数等于两数之积除以它们的最大公约数
int lcm(int a, int b)
{
    return a * b / gcd(a, b);
}

int main()
{
    int a, b;
    cout << "Enter two positive integers:" << endl;
    cin >> a >> b;
    cout << "GCD(" << a << ", " << b << ") = " << gcd(a, b) << endl;
    cout << "LCM(" << a << ", " << b << ") = " << lcm(a, b) << endl;
    return 0;
}

以下是两个示例:

  1. 将a设为98,b设为63。执行程序后,结果应该为:GCD(98, 63) = 7,LCM(98, 63) = 2184。

  2. 将a设为45,b设为30。执行程序后,结果应该为:GCD(45, 30) = 15,LCM(45, 30) = 90。

方法二:枚举法

枚举法是一种简单易懂但效率低下的求解最大公约数和最小公倍数的方法。具体步骤如下:

  1. 设a、b是待求的两个正整数。

  2. 对它们进行因数分解,记作:

​ a=$m_1p_1^{q_1}m_2p_2^{q_2} \cdots m_np_n^{q_n}$

​ b=$n_1r_1^{s_1}n_2r_2^{s_2} \cdots n_mr_m^{s_m}$

  1. 其中,$m_1, m_2, \cdots , m_n$ 和 $n_1, n_2, \cdots , n_m$ 是不同的质数,$p_1, p_2, \cdots , p_n$ 和 $r_1, r_2, \cdots , r_m$ 是它们的指数。

  2. 则:

​ gcd(a,b)=$ltp_{m_j} ^ {min(q_j,s_j)}$

​ lcm(a,b)=$lt{p_{m_j}}^{max(q_j,s_j)}$

下面是C++代码实现:

#include <iostream>
using namespace std;

// 判断一个数是否为质数
bool is_prime(int x)
{
    if (x <= 1)
        return false;
    for (int i = 2; i * i <= x; i++)
        if (x % i == 0)
            return false;
    return true;
}

// 枚举法求最大公约数
int gcd(int a, int b)
{
    int g = 1;
    for (int d = 2; d <= a && d <= b; d++)
        if (a % d == 0 && b % d == 0)
            g = d;
    return g;
}

// 枚举法求最小公倍数
int lcm(int a, int b)
{
    int l = 1;
    for (int p = 2; p <= a || p <= b; p++)
    {
        if (is_prime(p))
        {
            int ap = 0, bp = 0;
            while (a % p == 0)
            {
                a /= p;
                ap++;
            }
            while (b % p == 0)
            {
                b /= p;
                bp++;
            }
            int cp = max(ap, bp);
            while (cp-- > 0)
                l *= p;
        }
    }
    return l;
}

int main()
{
    int a, b;
    cout << "Enter two positive integers:" << endl;
    cin >> a >> b;
    cout << "GCD(" << a << ", " << b << ") = " << gcd(a, b) << endl;
    cout << "LCM(" << a << ", " << b << ") = " << lcm(a, b) << endl;
    return 0;
}

以下是两个示例:

  1. 将a设为98,b设为63。执行程序后,结果应该为:GCD(98, 63) = 7,LCM(98, 63) = 2184。

  2. 将a设为45,b设为30。执行程序后,结果应该为:GCD(45, 30) = 15,LCM(45, 30) = 90。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何用C++求两个数的最大公约数和最小公倍数 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • win7/win10+vs2015+pcl1.8.0配置方案详解

    Win7/Win10 + VS2015 + PCL 1.8.0 配置方案详解 概述 本文主要介绍如何在 Windows 7 或 Windows 10 操作系统上使用 Visual Studio 2015 配置 PCL(Point Cloud Library) 1.8.0。其中,PCL 是一个开源的库,用于处理点云数据。在配置 PCL 开发环境之前,需要先安装…

    C 2023年5月23日
    00
  • 用C++编写扩展node.js(node-ffi版)

    编写扩展是Node.js的一大特色,可用于使用C/C++或其他语言来扩展Node.js核心功能或为Node.js实现第三方模块。其中,Node.js提供了两个核心库,即N-API和node-gyp,可以让我们更加方便地编写扩展。另外,node-ffi是另一款非常流行的编写扩展的库。下面,我们就来具体讲解如何使用C++编写扩展node.js(node-ffi版…

    C 2023年5月23日
    00
  • 荣耀MagicBook值得买吗?荣耀MagicBook性价比全面图解评测

    荣耀MagicBook值得买吗?荣耀MagicBook性价比全面图解评测 背景介绍 本文将对荣耀MagicBook进行全面图解评测,并分析其性价比,以帮助消费者决定是否购买该产品。 外观 荣耀MagicBook的外观设计简洁大气,机身采用全金属材质,非常的耐磨且具有质感。机身厚度不到16mm,重量仅1.45kg,非常适合日常携带。独立屏幕造型更加简洁,含边框…

    C 2023年5月22日
    00
  • 详解利用C语言如何实现简单的内存池

    利用C语言实现简单的内存池一般可以分为以下步骤: 步骤一:自定义内存池数据结构 首先,我们需要自定义一个内存池的数据结构,一般包含以下几个要素: 内存池的大小(即可分配的内存总大小) 内存块的大小(即每个可分配的内存块的大小) 空闲内存块的数量(即尚未被分配的内存块的数量) 内存块的首地址(即内存池的起始地址) 我们可以使用结构体来表示这些要素,例如: st…

    C 2023年5月23日
    00
  • Win10提示错误代码 0xc000012F(坏图像)怎么办?

    首先,针对Win10提示错误代码 0xc000012F(坏图像),我们可以采取以下几个步骤进行处理: 确认错误类型 在处理问题之前,我们需要明确错误类型。针对这个错误代码,我们可以初步推断是系统文件损坏导致,因此我们可以采取以下思路进行处理。 运行磁盘扫描 在确认了错误类型之后,我们可以通过运行磁盘扫描,检查系统文件是否存在问题。具体的步骤如下: 打开“此电…

    C 2023年5月23日
    00
  • C语言实现通讯录

    一、通讯录准备 1. 通讯录信息的准备 2. 通讯录功能的框架 3. 文件安排 二、实现通讯录的功能 1. 添加功能 2. 删除功能 3. 展示功能 4. 更改功能 5. 查找功能 6. 排序功能 三、总结 1.在main函数中,采用&的原因 2.在使用scanf函数时,为何某些参数不需要&,而有一些参数需要使用& 3.在添加功能中,…

    C语言 2023年4月18日
    00
  • 用c语言实现《狼人杀》游戏发牌系统

    让我来为您详细讲解“用c语言实现《狼人杀》游戏发牌系统”的完整攻略。 首先需要明确的是,狼人杀游戏中的牌有很多种,包括狼人牌、村民牌、预言家牌等等。每局游戏需要给每位玩家分配一个随机的牌,因此开发牌局发牌系统需要实现以下功能: 随机洗牌,保证每次发牌的牌序不同 根据牌的数量和玩家人数,将不同的牌分配给玩家 显示每个玩家的牌 下面是一个实现《狼人杀》游戏发牌系…

    C 2023年5月24日
    00
  • c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    C#几种数据库的大数据批量插入 在C#开发中,我们经常需要将大量数据批量插入到数据库中。本攻略将讲解如何在C#中实现SqlServer、Oracle、SQLite和MySql几种数据库的大数据批量插入。 SqlServer 使用SqlBulkCopy可以实现大数据批量插入到SqlServer中。具体步骤如下: 创建SqlBulkCopy对象并设置目标表名和连…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部