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

yizhihongxing

我们可以使用以下两种方法求出两个数的最大公约数(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日

相关文章

  • C++设计模式之组合模式

    C++设计模式之组合模式攻略 简介 组合模式(Composite Pattern)是一种结构型设计模式。组合模式可以将对象组合成树形结构,表示“部分-整体”的结构层次关系,让客户端统一对待单个对象和组合对象。 结构 组合模式将对象组织成树形结构,有以下三个角色: Component(抽象构件) 抽象构件定义了叶子和容器构件的公共接口,并可以提供一些默认的行为…

    C 2023年5月22日
    00
  • 使用Protocol Buffers的C语言拓展提速Python程序的示例

    使用Protocol Buffers的C语言拓展能够提高Python程序的运行速度。下面是使用方法的完整攻略: 1. 安装Protocol Buffers 使用Protocol Buffers前,需要先安装它。可以使用以下命令安装: $ sudo apt-get install protobuf-compiler libprotobuf-dev 2. 编写协…

    C 2023年5月30日
    00
  • C++深入讲解new与deleted关键字的使用

    C++深入讲解new与delete关键字的使用 在C++中,我们可以通过new关键字动态地分配内存,通过delete关键字释放已经分配的内存。new和delete是C++中动态内存管理的必备工具,掌握它们的使用方法对于C++程序员来说至关重要。 本文将详细介绍new和delete的用法以及注意事项。 基本用法 动态分配内存 我们可以使用new关键字从堆中动态…

    C 2023年5月22日
    00
  • C语言实现走迷宫

    当我们想要C语言实现走迷宫时,我们需要考虑以下步骤: 定义迷宫的数据结构与迷宫的初始化。 使用DFS或BFS等算法遍历迷宫。 处理搜索的结果,输出路径或者其他信息。 下面我将详细解释如何实现这些步骤。 定义迷宫的数据结构与迷宫的初始化 迷宫的数据结构通常使用二维字符数组来表示,其中每个位置包含一个字符表示当前位置的状态。我们可以使用常见的“#”代表障碍物,使…

    C 2023年5月23日
    00
  • C++ std::shared_mutex读写锁的使用

    C++11中引入的 std::shared_mutex 是一种读写锁,可以在多个线程对同一个数据进行读写的情况下实现线程安全。shared_mutex允许多个线程同时进入读共享区,但只允许一个线程进入写互斥区。 如何使用 shared_mutex 使用 shared_mutex 需要注意以下几点: 1.定义 shared_mutex 对象 2.读共享区,需要…

    C 2023年5月22日
    00
  • 详解C++编程中的输入输相关的类和对象

    详解C++编程中的输入输出相关的类和对象 在C++语言中,有关输入输出流的操作由iostream库提供支持。iostream库中包括了三个类:istream、ostream和iostream,其中istream用于读取输入流,ostream用于输出流,而iostream继承了这两个类的所有方法,既可以用来读取输入流,也可以用来输出流。C++中还有一些常用的输…

    C 2023年5月22日
    00
  • 使用C++ MFC编写一个简单的五子棋游戏程序

    使用C++ MFC编写五子棋游戏程序需要遵循一定的步骤: 创建MFC应用程序工程:使用Visual Studio创建空的MFC应用程序,并确定目标平台、字符集、应用程序类型等基本设置。 设计窗口UI:在资源视图中添加对话框资源,并设计出游戏界面,包括棋盘、落子点、游戏状态等。 编写对话框类:在对话框类中添加游戏逻辑处理函数,并在OnLButtonDown等消…

    C 2023年5月23日
    00
  • C语言中调用汇编语言详解

    C语言和汇编语言是近年来广泛应用于硬件控制、系统底层控制、嵌入式系统等方面的编程语言,由于汇编语言能够直接访问和控制硬件资源,所以在需要对硬件进行底层控制时,常常需要用到汇编语言编写的程序。作为高级语言代表的C语言,也能够和汇编语言进行良好的协同工作。下面将讲解如何在C语言中调用汇编语言。 1.编写汇编程序 在C语言程序中调用汇编语言程序,首先需要编写一个汇…

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