如何用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日

相关文章

  • 详解dll动态库的开发与调用及文件的读写小程序

    详解dll动态库的开发与调用及文件的读写小程序 动态链接库(DLL)是一种非常重要的可执行文件类型,它允许各种应用程序在加载时动态地调用它所包含的函数或者资源。本文将详细说明如何开发和调用DLL动态链接库,并提供文件读写小程序的示例。 DLL动态库开发 1. DLL的定义 首先,我们要定义我们的DLL动态链接库,用到的头文件如下: #ifndef _MY_D…

    C 2023年5月23日
    00
  • PHP实现JS中escape与unescape的方法

    实现JS中escape与unescape的方法,可以在原生PHP的基础上进行编写,具体步骤如下: 1. 定义函数 escape escape 函数的作用是将字符串转化为类似于JS escape 方法所做的编码。例如: var str = "example string"; var encoded = escape(str); consol…

    C 2023年5月23日
    00
  • Java异常 Exception类及其子类(实例讲解)

    Java异常 Exception类及其子类(实例讲解) 在Java中,异常是指在程序运行过程中发生的不正常情况,需要由程序对其进行处理以保障程序正常运行。Java异常类型分为Error和Exception,其中Error是指不可恢复的错误,如内存不足等;Exception则是可被捕获和处理的异常。 在Exception类中,又存在多个子类,每个子类可以处理不…

    C 2023年5月23日
    00
  • JSONP跨域原理以及实现方法详解

    当我们在网页中使用AJAX技术进行异步数据请求时,经常会遇到一些跨域请求数据的问题。此时,如果我们确定请求的目标网站是值得信任的,就可以考虑使用JSONP来解决跨域请求的问题。 什么是JSONP JSONP全称为JSON with Padding,是一种跨域数据请求方式。JSONP的原理是通过动态创建元素,并将需要请求的数据作为参数传递到URL中,从而让服务…

    C 2023年5月23日
    00
  • C语言实现字符串替换的示例代码

    下面我来详细讲解一下“C语言实现字符串替换的示例代码”的完整攻略。该攻略分为以下几个部分: 前置知识 在学习字符串替换的示例代码之前,需要了解以下常用C语言函数: strcpy() 函数原型: char *strcpy(char *dest, const char *src); 函数说明: 将src所指向的字符串复制到dest所指向的字符串中,即把src的内…

    C 2023年5月24日
    00
  • Node.js 源码阅读深入理解cjs模块系统

    Node.js 源码阅读深入理解cjs模块系统的攻略可以分为以下几步: 1. 下载 Node.js 源代码 首先需要从 Node.js 官方网站下载 Node.js 的源代码。可以去 Node.js官网 下载最新版本的源代码,或者从 GitHub上的 Node.js仓库 上下载。下载后解压至本地,然后使用命令行工具进入解压后的目录。 2. 阅读 cjs 模块…

    C 2023年5月23日
    00
  • C语言make和Makefile介绍及使用

    C语言make和Makefile介绍及使用 什么是make make是一种自动化编译工具,可以根据源代码和规则文件(Makefile),自动化地编译出可执行文件。make的主要优点是能够自动化编译过程,只需要更新发生改变的文件,就可以快速地编译出目标文件或可执行文件。这对于大型项目和复杂项目来说,非常有用。 Makefile介绍 在使用make时,需要编写一…

    C 2023年5月23日
    00
  • 详解C++内存的代码区,全局区,栈区和堆区

    首先我们来了解一下 C++ 内存分区的四个部分:代码区、全局区、栈区和堆区。 代码区 代码区是用于存放程序的可执行代码,是只读的,它的大小在程序编译时就已经确定了。在代码区中,每个函数都有一个入口地址,这些入口地址按照函数声明的顺序保存在函数表中。 全局区 全局区用于全局变量和静态变量的存储,它在程序运行前就已经分配好了固定的内存空间,程序结束时才会被释放。…

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