线段上的格点 辗转相除法(GCD)

/*
问题描述:
线段上的格点
给定平面上的两个格点 P1 = (x1, y1) ; P2 = (x2, y2) 线段P1 P2上,除P1 和 P2以外一共有几个格点
*/
/*
分析过程
在格点上画P1(0,5) P2(5,0) 连接起来发现 这条线上的经过的格子的格点都在P1 P2这条线段上
将其不称 P1 P2为斜边的直角三角形 发现因为每一个小的三角形 和大三角形都是相似
再画P1(0, 8) P2(3,4) 这条线段上没有格点 但是如果向下扩展成一个边之比为2的一个相似三角形 得到
P1(0, 8) P2'(6, 0) 那么发现 刚才的P2(3,4)就是这个新的线段上的一个格点

所以也就是说 当线段中的点构成的三角形 和大三角形相似 且成整数倍的时候 这个格点就在格点上
那么要计算多少个这样的三角形 --->>找出最小的相似三角形 设P1(x1, y1) P2(x2,y2)
最小的三角形 直角边长 |x1-x2| / gcd(|x1-x2|, |y1-y2|) , |y1-y2| / gcd(|x1-x2|, |y1-y2|)
显而易见 那么这样最小三角形的个数 就是gcd(|x1-x2|, |y1-y2|)
所以这道题就是求gcd(|x1-x2|, |y1-y2|)
*/

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <queue>
 5 #include <algorithm>
 6 #define READ() freopen("in.txt", "r", stdin);
 7 #define MAXV 2007
 8 #define MAXE 20007
 9 #define INF 0x3f3f3f3f3f3f3f3f
10 using namespace std;
11 
12 typedef pair<int,int> P;
13 
14 //复杂度 < O(log max(a,b))
15 int gcd(int x, int y)//辗转相除法
16 {
17                                                                                                                           if (y == 0) return x;
18     else return gcd(y , x % y);
19 }
20 int main()
21 {
22     READ()
23     P p1, p2;
24     int x, y;
25     scanf("%d%d", &p1.first, &p1.second);
26     scanf("%d%d", &p2.first, &p2.second);
27     x = abs(p1.first - p2.first);
28     y = abs(p1.second - p2.second);
29 //    if (x < y)
30 //    swap(x, y);可以不用swap因为 一次gcd后 自动就变为x > y
31     int ans = gcd(x, y);
32     cout << ans - 1 << endl;//因为最后一个是自己线段上这个端点
33     return 0;
34 }

 

转载于:https://www.cnblogs.com/oscar-cnblogs/p/6427064.html

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值