求最大公约数,最小公倍数(c++)

2023-10-27

最大公约数

质数和合数

  • 质数也称素数, 指大于1, 并且除了1和它自己, 不能被任何其他自然数整除的数。
  • 除了1和质数的其他自然数称为合数, 合数必定可以分解成2个或以上个质数相乘。例如4 = 2 x 2, 6 = 2 x 3。

公约数

一个自然数a的约数表示能整除a的数,把一个数作因式分解,变成若干质数的乘积,例如 24 = 2 x 3 x 4, 所有质因数的乘法组合,都是它的约数。例如2,3,4, 2x3, 2x4, 3x4, 2x3x4都是24的约数, 公约数是指两个数a, b相同的约数, 其中最大的那个就是公约数。例如30 = 2 x 3 x 5, 与24的公约数有2, 3, 2 x 3, 最大公约数便是6。

计算最大公约数

求a和b的最大公约数,假设a > b, a % b == c,

  • 如果c == 0, 则b能整除a, b同时也能整除它自己, a, b的最大公约数便是b。
  • 如果c != 0, c就是a在取模b后的余数部分, 正是多了无法被b整除的这部分, 确定b不能作为它们的公约数。假设div = a / b。 div肯定是b的倍数, 假设b和c的最大公约数为d, d能整除b, 能整除c。 则d必定能整除作为b的倍数的div, d必定能整除a == (div + c), 也为a的约数。
  • 虽然d是(b, c)的最大公约数, 并且是a的约数, 为何为何d是(a, b, c)最大的公约数? 不能存在d_bigger > d, 是(a, b, c)的最大公约数吗? 答案是不能, 假如d_bigger存在,它是(a, b, c)的最大公约数,它必然是(b, c)的约数(不一定是最大), 由于d_bigger > d, 显然与d 是(a, b)的最大公约数矛盾, 如果d_bigger存在, 那么d就不可能是(b, c)的最大公约数。

辗转相除法

求(a, b)的最大公约数, a > b, c = a % b, 如果c == 0, 则结果为b, 如果c != 0, 问题转化为求b, c的最大公约数。 通过循环或者递归即可解决此问题。

代码实现

// 循环
long long GreatestCommonDivisor(long long a, long long b)
{
	if (a == 0 || b == 0) {
		return 0;
	}

	long long max, min;
	if (a < b) {
		min = a;
		max = b;
	}
	else {
		min = b;
		max = a;
	}
	long long the_mod = max % min;
	while (the_mod != 0){
		max = min;
		min = the_mod;
		the_mod = max % min;
	}
	return min;
}

// 递归
long long GreatestCommonDivisor(long long a, long long b)
{
	if (a == 0 || b == 0) {
		return 0;
	}

	long long max, min;
	if (a < b) {
		min = a;
		max = b;
	}
	else {
		min = b;
		max = a;
	}
	long long the_mod = max % min;
	if(the_mod == 0){
	    return min;
	}else{
	    return GreatestCommonDivisor(min, the_mod);
	}
}

最小公倍数

一个自然数a的倍数, 必然是包含它所有质因数的数, a, b的公倍数, 就是既包含a的所有质因子,也包含b的所有质因子的数。 最公倍数就是, 满足包含a, b所有质因子的条件下, 质因子能少就少。 假设a = 24 = 2 x 3 x 4, 则24的所有质因数2, 3, 4都必不可少, b = 30 = 2 x 3 x 5, 它的所有质因数2, 3, 5都是必不可少, a和b存在重复的部分, 这些重复的部分, 可以只要1份就好, 最终得到的一定是a, b的倍数, 并且是最少了。 而a, b,的质因数公共部分的乘积, 恰恰就是最大公约数。 假如最大公约数为c, a除去最大公约数后剩下的部分就是a / c, b除去最大公约数后剩下的部分是b / c, 最大公约数只要一份就好。因此最小公倍数的公式
lcm = c * (a / c) * (b / c) = a * b / c

代码实现

long long LeastCommonMultiple(long long a, long long b)
{
	if (a == 0 || b == 0) {
		return 0;
	}

	return a * b / GreatestCommonDivisor(a, b);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

求最大公约数,最小公倍数(c++) 的相关文章

  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 逻辑运算符详细讲解(基础版)

    本文将详细讲解6个逻辑运算符的应用 总结放在最后了哦 1 与 gt 见false则为false 这里用两个关系表达式进行比较 只要其中一个运算结果为false则最后结果也为false 2 或 gt 见true则为true 这里用两个关系表达
  • openGauss学习笔记-66 openGauss 数据库管理-创建和管理schema

    文章目录 openGauss学习笔记 66 openGauss 数据库管理 创建和管理schema 66 1 背景信息 66 2 注意事项 66 3 操作步骤 66 3 1 创建管理用户及权限schema 66 3 2 使用schema 6
  • python-图形用户界面

    图形用户界面 1 python中图形界面库 界面开发 Tkinter 是 Python 官方提供的图形用户界面开发库 用于封装 TGUI 工具包 跨平台 PyQt 是非 Python 官方提供的图用户界面开发库 用于封装 Qt 工具包 跨平
  • 解决Xilinx Vitis 2020.1版本启动之后进入主页面无响应的结果

    一 问题描述 在启动 Xilinx Vitis 2021 1 时 无论是从 Xilinx Vivado 界面的 Launch Vitis 启动还是直接启动都会在启动后显示出主界面后未响应 其原因是 Windows 系统的 PATH 环境变量
  • dataframe iloc_pandas

    点击上方蓝字 关注并星标 和我一起学技术 今天是pandas数据处理专题第三篇文章 我们来聊聊DataFrame中的索引 上篇文章当中我们简单介绍了一下DataFrame这个数据结构的一些常见的用法 从整体上大概了解了一下这个数据结构 今天
  • 解决报错:java: You aren‘t using a compiler supported by lombok, so lombok will not work and has been dis

    解决idea 的因为lombok的报错 java You aren t using a compiler supported by lombok so lombok will not work and has been disabled Y
  • 【代码笔记】Transformer代码详细解读

    Transformer代码详细解读 文章目录 Transformer代码详细解读 简介 1 数据准备 1 1 词表构建 1 2 数据构建 2 模型整体架构 2 1 超参数设置 2 2 整体架构 2 2 模型训练 3 编码器 Encoder
  • source: no such file or directory: .bash_profile

    今天想看maven版本结果一直报未分配maven环境 因为用了idea后一直没顾上观察maven 直接打开vim bash profile 发现环境已经搭好了 没办法重新 source bash profile生效这个文件 结果报 经过网上
  • 启动Nessus服务后,登录https://localhost:8834时,提示无法访问网页

    安装Nessus后 登录https localhost 8834时提示网页无法访问 去到安装目录下的以系统管理员运行Nessusd exe时弹出提示nessusd exe启动失败 无法找到入口 无法作用于动态链接库C windows sys
  • system/WIFEXITED/WEXITSTATUS函数-linux

    system 感性认识 systerm两层含义 1 正确退出后 还需要再判断 操作成功或者操作失败 2 错误退出 include
  • TOMCAT配置:参数大小maxPostSize,参数个数maxParameterCount

    在更新了JSON校验器后 理论上不再存在问题 但是在使用JSON传递表单数据进行保存时依然出现了保存异常的情况 前台数据为7200个JSONObject组成的JSONArray 大小约为1 83M 其他参数若干 在参数传递到后台时发现后台并
  • 最新的Vivado安装、使用教程(2022/12/31)

    本文主要参考了黑金社区提供的资料 整理而成 目录 1 Vivado 开发环境 1 1 Vivado 软件介绍 1 2 Vivado 软件版本 2017 4比较稳定 2 Vivado 软件 Windows 下安装 3 重新安装驱动 4 大功告
  • 中位数(C语言)

    Description 计算有限个数的数据的中位数的方法是 把所有的同类数据按照大小的顺序排列 如果数据的个数是奇数 则中间那个数据就是这群数据的中位数 如果数据的个数是偶数 则中间那2个数据的算术平均值就是这群数据的中位数 现在给出n个正
  • Go语言最全面试题,拿offer全靠它,附带免积分下载pdf

    面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 Go 基础类 GO 语言当中 NEW 和 MAKE 有什么区别吗 PRINTF SPRINTF FPRINTF 都是格式化输出 有什么不同 GO 语言当中数
  • xss-level1

    首先搭建xss靶场 打开浏览器输入地址来到第一关 这里我先查看了一下源代码 先试一下弹出会话框 name lt
  • 程序跑飞的如何查问题

    在下这厢有礼了 最近一直在调试公司的代码 调的我有点慢 给自己总结一下 我是在FPGA上调试 一个通信交互的工程 我遇到程序跑飞的无非是三种情况 1 数组越界 就是数组的大小只有array 100 但是那你用了array 500 产生越界
  • rk3368 开机内核启动不了

    Platform RK3368 OS Android 6 0 Kernel 3 10 0 电源管理芯片用的是配套的rk818 经测量发现板子在上电启动时 u boot阶段与kernel阶段dcdc电压不一样 从uboot切换到kernel时
  • 矩阵特征值与行列式、迹的关系

    矩阵的特征值之和等于矩阵的行列式 矩阵的特征值之积等于矩阵的迹 简单的理解证明如下 1 二次方程的韦达定理 请思考 x 2 bx c 0 这个方程的所有根的和等于多少 所有根的积等于多少 2 把二次方程推广到 N 次
  • Linux下安装opencv with-ffmpeg解决无法读取视频的问题

    Linux下安装opencv with ffmpeg解决无法读取视频的问题 参考文章 1 Linux下安装opencv with ffmpeg解决无法读取视频的问题 2 https www cnblogs com haiyang21 p 1
  • 求最大公约数,最小公倍数(c++)

    文章目录 最大公约数 质数和合数 公约数 计算最大公约数 辗转相除法 最小公倍数 最大公约数 质数和合数 质数也称素数 指大于1 并且除了1和它自己 不能被任何其他自然数整除的数 除了1和质数的其他自然数称为合数 合数必定可以分解成2个或以