原文题目链接:
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;
注意的地方:对于浮点型数比大小的操作一定要慎重。不然这题极有可能算错。具体应如何操作详见上面的代码。
以上只是我做题时的解法。
如果有更好的解法、更好的思路,欢迎评论讨论~O(∩_∩)O~
题目分析: