Project Euler 91:Right triangles with integer coordinates 格点直角三角形
Right triangles with integer coordinates
The points P (x1, y1) and Q (x2, y2) are plotted at integer co-ordinates and are joined to the origin, O(0,0), to form ΔOPQ.
There are exactly fourteen triangles containing a right angle that can be formed when each co-ordinate lies between 0 and 2 inclusive; that is,0 ≤ x1, y1, x2, y2 ≤ 2.
Given that 0 ≤ x1, y1, x2, y2 ≤ 50, how many right triangles can be formed?
点P(x1, y1)和点Q(x2, y2)都是格点,并与原点O(0,0)构成ΔOPQ。
当点P和点Q的所有坐标都在0到2之间,也就是说0 ≤ x1, y1, x2, y2 ≤ 2时,恰好能构造出14个直角三角形。
如果0 ≤ x1, y1, x2, y2 ≤ 50,能构造出多少个直角三角形?
解题
先网上找到的答案,然后看题解中,前面几题给出了暴露的方法,遍历所有的点 ,判断是否是直角三角形就好了,最后的结果要除以2,,因为两个点是可以互换的。
Java
package Level3; public class PE091{
static void run(){
int N = 50;
int count = 0;
// 第一个顶点
for(int x1 = 0; x1<=N;x1++){
for(int y1 = 0;y1<=N ;y1++){
if(x1==0 && y1==0) continue;
// 第二个顶点
for(int x2 = 0;x2<=N;x2++){
for(int y2=0;y2<=N;y2++){
if(x2==0&&y2==0 || x1==x2&&y1==y2)
continue;
//判断是否是三角形
double d1 = getDistance(0,0,x1,y1);
double d2 = getDistance(0,0,x2,y2);
double d3 = getDistance(x1,y1,x2,y2);
if(d1+d2==d3|| d1+d3==d2||d2+d3==d1)
count++;
}
}
}
}
System.out.println(count/2);
}
// 14234
// running time=0s71ms
static double getDistance(int x1,int y1,int x2,int y2){
double d1 = (x1-x2)*(x1-x2);
double d2 = (y1-y2)*(y1-y2);
return d1+d2;
} public static void main(String[] args) {
long t0 = System.currentTimeMillis();
run();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms"); }
}
上面给出来很好的不用暴力的方法
对于直角在原点的情况:
P Q两点只能在x轴 y轴上,固定一点看另一点,显然有50中可能,然而这一点也有50种可能,共2500种
对于直角在x轴或者y轴的情况:
当P 在x轴上的某点时候,Q的x坐标显然要和P 的一样,PQ都各有50个位置,共2500种
当P 在y轴的时候,也有2500种
对于直角在方格内部的时候:
要使得是直角三角形:OP要垂直PQ
OP的斜率:k = dy/dx (dy/dx是最简分数) 其中P的坐标设为(x,y)
则PQ的斜率是:-dx/dy
如何根据斜率,找到Q的整数点,或者Q点的个数。
当P点的y轴值>Q点的y轴的值时候:
(如上图所示)可以发现:Q1 Q2 把PQ3等分成三份。三个Q点都是整数点。
对斜率为k = dy/dx :可以通过一个dy * dx的方格表示出来,所以,对于P(x,y)点,x每加一个dx y每减一个dy都是一个整数Q点,那么有多少个符合要求的点?只需要看最大能走多少步,
对于PQ的斜率是dx/dy,当P(x,y), 对x而言最大的步数是:(N-x)/dy ,对y而言最大的步数是:y/dx
这样其最小值就是Q的整数点数:MIN((N-x)/dy,y/dx)
当P点的y轴值<Q点的y轴的值时候:
PQ的斜率是:-dx/dy
P(x,y) x向左走的最大步数:x/dy y向上走的最大步数:(N-y)/dx
这样其最小值就是Q的整数点数:MIN(x/dy,(N-y)/dx)
这与上面链接的结果不一样,根据运行结果发现答案是一样的
其实吧 对于P点的坐标可以是在N*N方格中的任意一点,P的坐标是可以对称的,所以可以直接乘以二的。
JAVA
package Level3; public class PE091{
static void run1(){
int N = 50;
// 直角在原点,直角在x轴 直角在y轴,个数都是N*N
int result =N*N*3;
//下面只需要对直角在方格内部的情况
for(int x = 1;x<= N;x++){
for(int y=1;y<= N;y++){
int fact = gcd(x,y);
result += Math.min(y*fact/x, (N-x)*fact/y);
result += Math.min(x*fact/y, (N-y)*fact/x);
}
}
System.out.println(result);
}
// 14234
// running time=0s78ms
static int gcd(int x,int y){
if(x<y){
int tmp = x;
x = y;
y = tmp;
}
int r = x%y;
while(r!=0){
int tmp =x;
x = y;
y = tmp%x;
r = x%y;
}
return y;
}
static void run(){
int N = 50;
int count = 0;
// 第一个顶点
for(int x1 = 0; x1<=N;x1++){
for(int y1 = 0;y1<=N ;y1++){
if(x1==0 && y1==0) continue;
// 第二个顶点
for(int x2 = 0;x2<=N;x2++){
for(int y2=0;y2<=N;y2++){
if(x2==0&&y2==0 || x1==x2&&y1==y2)
continue;
//判断是否是三角形
double d1 = getDistance(0,0,x1,y1);
double d2 = getDistance(0,0,x2,y2);
double d3 = getDistance(x1,y1,x2,y2);
if(d1+d2==d3|| d1+d3==d2||d2+d3==d1)
count++;
}
}
}
}
System.out.println(count/2);
}
// 14234
// running time=0s71ms
static double getDistance(int x1,int y1,int x2,int y2){
double d1 = (x1-x2)*(x1-x2);
double d2 = (y1-y2)*(y1-y2);
return d1+d2;
} public static void main(String[] args) {
long t0 = System.currentTimeMillis();
run();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms"); }
}
Python
# coding=gbk import time as time
from itertools import combinations
def run():
N = 50
count = N*N*3
for x in range(1,N+1):
for y in range(1,N+1):
fact = gcd(x,y)
count += min((N-x)*fact/y,y*fact/x)*2
print count #
# running time= 0.00300002098083 s
def gcd(x,y):
if x<y:
x,y = y,x
while x%y!=0:
tmp = x
x = y
y = tmp%y
return y t0 = time.time()
run()
t1 = time.time()
print "running time=",(t1-t0),"s"
Project Euler 91:Right triangles with integer coordinates 格点直角三角形的更多相关文章
- [project euler] program 4
上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...
- Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.
In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...
- Python练习题 039:Project Euler 011:网格中4个数字的最大乘积
本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...
- Python练习题 032:Project Euler 004:最大的回文积
本题来自 Project Euler 第4题:https://projecteuler.net/problem=4 # Project Euler: Problem 4: Largest palind ...
- Python练习题 029:Project Euler 001:3和5的倍数
开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...
- Project Euler 9
题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...
- project euler 169
project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...
- 【Project Euler 8】Largest product in a series
题目要求是: The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × ...
- Project Euler 第一题效率分析
Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...
随机推荐
- javascript面向对象--自定义类型
Javascript是基于原型实现面向对象的,因此并没有类和接口,它的对象也与其他基于类的语言中的对象有所不同.在Javascript中,每个对象都是基于一个引用类型创建的,这个引用类型可以是原生类型 ...
- Windows7系统禁用USB和启用USB方法
被迫装了XX软件之后,无线网络和USB都被禁用了,XX软件还不能被卸载.只能用PE进去时候把XX软件安装目录进行删除,但是删除之后还是不能识别U盘,从网上找到办法一看是注册表的项被修改了. 注册表项为 ...
- CentOS 6.4 下搭建 MongoDB 2.4.9 环境
一.下载MongoDB2.4.9版 下载MongoDB wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz 解压Mo ...
- 过拟合(Overfitting)和正规化(Regularization)
过拟合: Overfitting就是指Ein(在训练集上的错误率)变小,Eout(在整个数据集上的错误率)变大的过程 Underfitting是指Ein和Eout都变大的过程 从上边这个图中,虚线的左 ...
- mysql-5.5.46源码编译安装
1.安装准备 cat /etc/redhat-release uname -r yum install ncurses-devel cmake automake autoconf make gcc g ...
- WPF 一个弧形手势提示动画
这是一个操作提示动画,一个小手在屏幕上按照一个弧形来回运动 <Window x:Class="LZRichMediaWall.MainWindow" xmlns=" ...
- WPF-控件-编辑圆角TextBox
使用模板 代码如下: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xm ...
- spring中Bean的注入类型
1.属性注入 即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式. 属性注入要求Bean提供 ...
- Aspose 数字和日期 设置
Microsoft Excel一个非常强大的功能就是使客户可以设置数字和日期的显示格式,众所周知数字可以显示为不同的值格式,包含:小数.货币.百分数.分数.账面价值等,同样地Aspose.Cells也 ...
- CS0016: 未能写入输出文件的解决方法
编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727 \Temporary ASP.NET Files\roo ...