当前位置: 首页 > news >正文

算法中的数学:gcd与lcm

1.最大公约数和最小公倍数

前置知识补充:

a / b = c

a:被除数

b:除数

c:商

若商无余数,则a又叫b的倍数,b又叫a的约数且可以表示为 b | a

1.1定义

最大公约数(gcd):是一组整数中最大的共同约数

最小公倍数(lcm):是一组整数中最小的共同倍数

所处头文件:numeric

1.2应用

求两个数的gcd和lcm时,需要用到短除法

短处法的过程就是将你看出来了的公约数提取到左侧,然后将两个数除这个公约数进入下一行,循环进行,直到公约数为1停止。

此时,gcd就是所有公约数的乘积,lcm是所有剩余的数和所有公约数的乘积

且gcd和lcm的乘积就是两个数的乘积

于是我们就得到了常用方法求最小公倍数:先求最大公约数,再根据两个数的乘积除以最大公约数得到最小公倍数

1.3欧几里得算法(辗转相除法)

最大公约数的求法就是辗转相除法

下面我们讲解一下辗转相除法的用法:

假设a>b

若b是a的约数,那么最大公约数就是b

若b不是a的约数,那么gcd(a,b)->gcd(b,a%b),然后递归进行,直到b变为0,此时a就是最大公约数

假设a < b ,gcd会先从gcd(a,b)变为gcd(b,a),然后重复上面的逻辑

代码实现:

ll gcd(ll a , ll b)
{if(b == 0) return a;return gcd(b,a%b);

每次轮转就将b放到参数1位置,将参数二变为a%b,直到b等于0,说明最大公约数出来了,返回最大公约数a

1.4例题讲解

本题需要我们用数据量极大的数据a和整型数据b求最大公约数。

但是我们的gcd求最大公约数的算法中需要求a%b,如果直接求会越界、

解决方案

第一步:存储a的时候用string存储

第二步:利用秦九韶算法处处取模来求出不越界的余数

补充:秦九韶算法

作用:将一元n次多项式的问题转化为n个一次式的的算法,大大减少了计算难度

其实本质上就是不断提取公因式,最终简化为n个一次式.

而在本题中,一个极大的十进制数,可以看成x=10的n次多项式相加。

eg:12345

看成:1 * 10^4 + 2 * 10^3 + 3 * 10^2 + 4 * 10 + 5

体现在代码上的理解就是:每次先乘10,然后加下一项,最后取余,循环进行

解题:

#include<iostream>
using namespace std;
typedef long long ll;
string a;
ll b;
ll gcd(ll a, ll b)
{return b==0 ? a : gcd(b,a%b);
}
ll cal()
{ll num = 0;for(auto e : a){num = num*10 + e -'0';num %= b;}return num;
}
int main()
{cin >> a >> b;cout << gcd(b,cal()) << endl;return 0;
}

1.这里我们一开始就把b放在前面是因为gcd算法要求第一个参数是较大的,而b一定大于等于cal计算出来的a关于b的余数。

2.其实秦九韶算法就是除法的基本原理,我们这里相当于在模拟高精度除法取余的过程。

http://www.xdnf.cn/news/146071.html

相关文章:

  • 诗词大会竞赛主持稿串词(二)
  • CKESC SKY 6S 50A_4S 60A 电调专业测评
  • 常见网络安全攻击类型深度剖析(一):恶意软件攻击——病毒、蠕虫、木马的原理与防范
  • 51单片机中断
  • 【补题】Codeforces Round 789 (Div. 1)C. Tokitsukaze and Two Colorful Tapes
  • 智慧党建解决方案-1PPT(40页)
  • ThreadLocal详解与实战指南
  • LabVIEW老旧设备控制
  • Apache Spark 源码解析
  • 线程池配置实现多线程快速处理批量数据
  • 动态ip与静态ip的概念、区别、应用场景
  • 统计文件中单词出现的次数并累计
  • 【玩泰山派】7、玩linux桌面环境xfce - (4)使用gstreamer
  • 点云从入门到精通技术详解100篇-基于二次误差和高斯混合模型的点云配准算法
  • 【DE-III】基于细节增强的模态内和模态间交互的视听情感识别
  • LabVIEW轨道交通动力系统性能监控
  • Spring 与 ActiveMQ 的深度集成实践(一)
  • 佳博票据和标签打印:Web网页端与打印机通信 | iOS
  • freecad参数化三维模型装配体解析至web端,切换参数组或修改参数
  • 【维护窗口内最值+单调队列/优先队列】Leetcode 239. 滑动窗口最大值
  • 【数据结构】红黑树原理及实现
  • 如何在奥维互动地图里加载星图云卫星地图
  • 【文献阅读】建立高可信度的阴性样本,改进化合物-蛋白质相互作用预测
  • 《WebGIS之Vue零基础教程》(5)计算属性与侦听器
  • 数据库对比
  • C语言实现贪心算法
  • 嵌入式 C 语言面试核心知识点全面解析:基础语法、运算符与实战技巧
  • 企业网站html源代码 企业网站管理源码模板
  • linux centos7 python3安装
  • docker 代理配置冲突问题