目录:

  • 欧几里德算法(辗转相除法)
    • 1.问题引入:线段上格点的个数
    • 2.输入两个正整数,求最大公约数和最小公倍数
    • 3.P1029 最大公约数和最小公倍数问题

欧几里德算法(辗转相除法)

辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。

1.问题引入:线段上格点的个数

问题描述给定平面上的两个格点P1=(x1,y1)和P2=(x2,y2),线段P1P2上,除P1和P2以外一共有几个格点?
限制条件:-109≤x1,y1,x2,y2≤109

辗转相除法的原理:①a=b∗p+qa=b*p+qa=b∗p+q,所以gcd(b,q)gcd(b,q)gcd(b,q)既整除a又整除b,也就整除gcd(a,b)gcd(a,b)gcd(a,b)(公约数整除最大公约数)②q=a−b∗pq=a-b*pq=a−b∗p,同理可证gcd(a,b)gcd(a,b)gcd(a,b)整除gcd(b,q)gcd(b,q)gcd(b,q)。综上有gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a。不断这样操作下去,由于gcd的第二个参数总是不断减小的,最后会出现gcd(a,b)=gcd(c,0)gcd(a,b)=gcd(c,0)gcd(a,b)=gcd(c,0),而0和c的最大公约数就是c,所以gcd(c,0)=cgcd(c,0)=cgcd(c,0)=c,这样就计算出了gcd(a,b)gcd(a,b)gcd(a,b)

本题中虽然可以用穷举法,遍历min(x1,x2)≤x≤max(x1,x2)min(y1,y2)≤y≤max(y1,y2)的格点可以得到正确答案,但是复杂度确实O(|x1−x2|×|y1−y2|),其实这个题的答案是|x1−x2|和|y1−y2|的最大公约数减去1。(注意,|x1−x2|=0&&|y1−y2|=0时,答案为0)

原因
首先看一下|x1−x2|和|y1−y2|的
最大公约数代表的是啥? 其实可以看成 在横向和竖向的最大的公共等分数, 比如 6 的等分点可以是 1:1:1:1:1:1分成6份 ,也可以是
2:2:2分成3份,或者是 6,只有1份。(其实对应的是 6能被6,3,1整除) 那么 6和9的最大公共等分数是3,即6分为 2:2:2 ,
9分为3:3:3. 那么边长为6和9的矩形,按照这样分会是什么情况呢?

通过上图可以看出,大矩形的对角线正好经过 (2,3),(4,6),(6,9) 除开(6,9),就是本体所要求的点。这就是为什么这个题的答案是|x1−x2|和|y1−y2|的最大公约数减去1。

那这个题可以转换为求最大公约数的问题,最大公约数一般使用辗转相除法


#include<bits/stdc++.h>
using namespace std;
int gcd(int x, int y)
{if (y==0) return x;return gcd(y, x%y);
}
int x1,x2,y1,y2;
int main()
{cin>>x1>>y1>>x2>>y2;cout<<gcd(abs(x1-x2),abs(y1-y2))-1<<endl;
}

2.输入两个正整数,求最大公约数和最小公倍数

最大公约数和最小公倍数的乘积就是原两个数的积。

#include<bits/stdc++.h>
using namespace std;
int gcd(int x, int y)
{if (y==0) return x;return gcd(y, x%y);
}
int m,n,d,e;
int main()
{scanf("%d%d",&m,&n);if(m < n)swap(n,m);printf("最大公约数=%d\n最小公倍数=%d\n",gcd(m,n),m*n/gcd(m,n));return 0;}

3.P1029 最大公约数和最小公倍数问题


要知道最大公约数和最小公倍数的乘积就是原两个数的积。
两种方法超详细解答链接

注:如果您通过本文,有(qi)用(guai)的知识增加了,请您点个赞再离开,如果不嫌弃的话,点个关注再走吧,日更博主每天在线答疑 ! 当然,也非常欢迎您能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!( •̀ ω •́ )✧

【数论基础】欧几里德算法及其各种应用相关推荐

  1. 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)

    摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...

  2. ACM数论之旅4---扩展欧几里德算法(欧几里德(・∀・)?是谁?)

    为什么老是碰上 扩展欧几里德算法 ( •̀∀•́ )最讨厌数论了 看来是时候学一学了 度娘百科说: 首先, ax+by = gcd(a, b) 这个公式肯定有解 (( •̀∀•́ )她说根据数论中的相 ...

  3. 紫薯第10章数学 kaungbin专题14数论基础

    杂谈 kuangbin14数论Harmonic Number LightOJ - 1234 分段打表 + 欧拉爷爷o(1).(第一次触及了欧拉常熟) 10.1.1 && 10.1.2 ...

  4. 扩展欧几里德算法详解

    转自:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两 ...

  5. 浅析欧几里德算法 GCD和LCM

    前言 欧几里德算法作为有着非常简短的实现的算法,可能很多初学者(包括当时的我)都不求甚解.本文给出了GCD.LCM的性质,以及欧几里德算法的实现.证明和时间复杂度推导. 这里是我的个人网站: http ...

  6. 【数论】数论基础合集

    大佬的数论合集 目录 强烈推荐:大佬的博客:数论算法详解,超详细 一.欧几里得算法 二.扩展欧几里得算法 1.扩展欧几里得 扩展欧几里得原理 定理 (1).扩展欧几里得算法应用 (2)例题1.求整数x ...

  7. poj 2115 C Looooops(扩展欧几里德算法)

    题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循环几次才会结束. 比如:当k=4时,存储的数 i 在0-15之间循环.(本题默认为无符号) 若在有限次内结束,则输出 ...

  8. poj 1061 (扩展欧几里德算法)

    首先先抛出一个例题:            青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 89761   Acc ...

  9. 欧几里德算法+拓展欧几里德算法

    欧几里德算法一般简写为GCD,即辗转相除求最大公因数,模板为 ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b); } 由于这种求的方法适用于大数,所以一般数据类型 ...

最新文章

  1. mysql三范式和反三范式_数据库三范式和反三范式
  2. 使用计算机时什么是开机键什么是关机键,计算器上的开机键是关机键是
  3. Win11系统语言修改不了中文怎么办
  4. CodeFx: 微软一站式开发技术框架 2009-10-18 最新版本新鲜出炉啦!!!
  5. 我的WCF之旅(13):创建基于MSMQ的Responsive Service(转载)
  6. unity设置一个物体是另一个物体的子物体
  7. Charles抓包工具简单教程
  8. Linux分区类型EXT2、EXT3、EXT4详解
  9. 动手写一个二叉平衡树
  10. STEAM 教育相关书籍
  11. Xcode各种运行报错及解决方法
  12. Linux:crond任务调度之at定时任务
  13. 软件测试需要会python吗_真实揭秘90后职业新选择:25岁刚入行软件测试,竟拿到这么多薪资……...
  14. 为什么主页是http://123.sogou.com/,改不了,我还以为中木马了
  15. EasyRecovery是最好用的手机数据恢复工具
  16. HMC833 测试板总结
  17. fcitx只能打繁体字无法切换的一个解决方法linux mint
  18. Android手机4G网络设置ipv6
  19. 有几种水果不能空腹吃,你知道吗?
  20. vue+css漂亮的定制日历

热门文章

  1. js把文字中的空格替换为横线
  2. Oracle SQL Developer 的一个Bug
  3. Spring中jdbcTemplate的用法实例
  4. mac上使用crontab周期性执行python脚本
  5. Javascript全局变量var与不var的区别深入解析
  6. PostgreSQL备份之手工备份(Low Level API)
  7. 《3D数学基础》1.8 混合积
  8. Virtual Earth API 在指定zoomLevel添加自定义图层
  9. Cisco3750在多VLAN网络环境下DHCP的实现
  10. ssh协议是osi_TCP/IP 协议模型