projecteuler No.91 Right triangles with integer coordinates

原文题目链接:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值