projecteuler No.91 Right triangles with integer coordinates

来源:互联网 发布:淘宝一分钱秒杀验证 编辑:程序博客网 时间:2024/05/18 03:53

原文题目链接:

http://projecteuler.net/problem=91

翻译题目链接:

http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/92-91

通过人数:7727


题目分析:

这道题为一个枚举筛选的模型。因为一共可以涉及到的点的位置不多,于是依直角顶点的位置进行枚举。



解题过程(代码仅供参考,因为偷懒,代码风格什么的实在不好意思...):

一、若直角顶点在第一象限:

int ans = 0;for (int i = 1;i <= 50; i++){for (int j = 1; j <= 50; j++){double k = double(j)/i;double k_ = -1/k;        double b_ = j - k_ * i;for (int p = 0; p <= 50; p++){if (p == i)continue;double rr = k_ * p + b_;int r = floor(rr+0.0001);if (rr > 50 + 0.0001 || rr < -0.0001)continue;if (r + 0.0001 > rr)ans++;}}}
每个循环体考察了以点(i,j)为直角顶点的可能。

过点(i,j)的与(i,j)和原点的连线垂直的直线的解析式为:y=k_x+b_

考察这条直线在所要求的区间内的整点数即可。

二、若直角顶点在坐标轴上。

这种情况可以分成直角顶点在x正半轴、y正半轴和原点三种情况,每种情况都很容易求出有2500个直角三角形。于是,一共又增加了7500个三角形。

ans+=7500;


于是,两种情况一共有直角三角形14234个,即为所求。


注意的地方:对于浮点型数比大小的操作一定要慎重。不然这题极有可能算错。具体应如何操作详见上面的代码。






以上只是我做题时的解法。

如果有更好的解法、更好的思路,欢迎评论讨论~O(∩_∩)O~



题目分析:

0 0
原创粉丝点击