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"); }
}

参考链接1  参考链接2

上面给出来很好的不用暴力的方法

对于直角在原点的情况:

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 格点直角三角形的更多相关文章

  1. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

  2. 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 ...

  3. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  4. Python练习题 032:Project Euler 004:最大的回文积

    本题来自 Project Euler 第4题:https://projecteuler.net/problem=4 # Project Euler: Problem 4: Largest palind ...

  5. Python练习题 029:Project Euler 001:3和5的倍数

    开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...

  6. Project Euler 9

    题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...

  7. project euler 169

    project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...

  8. 【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 × ...

  9. Project Euler 第一题效率分析

    Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...

随机推荐

  1. silverlight Frame嵌套页面刷新问题

    1.此方法将会刷新到主页面 private void btn_Click(object sender, RoutedEventArgs e) { HtmlPage.Window.Eval(" ...

  2. ios 控件

    反序列化 JSONModel 上拉刷新 下拉加载更多 MJRefresh AFNetworking 2.5 Asynchronous image downloader with cache - SDW ...

  3. php读取excel日期类型数据的例子

    提供一个读取的函数:  代码如下 复制代码 //excel日期转换函数function excelTime($date, $time = false) { if(function_exists('Gr ...

  4. 第29章 项目10:DIY街机游戏

    1.问题 "Self-Defense Against Fresh Fruit":军士长指挥自己的士兵使用自我防御战术对抗以石榴.芒果.青梅和香蕉等新鲜水果入侵者.防御战术包括使用枪 ...

  5. 如何在SAE上使用DjangoUeditor

    之前的一个项目是部署到SAE上的,其中富文本编辑器使用到了Ueditor,对于Django有一个开源项目DjangoUeditor可以简化继承过程,直接引用app就可以使用.但是不支持SAE的文件上传 ...

  6. C# 获得手机归属地功能

    今天通过查资料了解到web的页面抓取功能,应用HttpWebRequest和HttpWebResponse功能,从http://www.showji.com网站中抓取归属地信息 应该说这个方法是从别的 ...

  7. C# 缓存学习总结

    昨天整理了一下缓存的基本用法,和缓存依赖类 CacheDependency类的使用,今天整理一下缓存的数据库依赖类SqlCacheDependency 1.数据库依赖类SqlCacheDependen ...

  8. hadoop的核心思想

    hadoop的核心思想 1.1.1. hadoop的核心思想 Hadoop包括两大核心,分布式存储系统和分布式计算系统. 1.1.1.1. 分布式存储 为什么数据需要存储在分布式的系统中哪,难道单一的 ...

  9. C#中使用SelectionStart属性指定输入框光标位置

    今天工作中遇到一个小BUG需要修改,需求为在文本框输入的过程中,如果数字是以0开头则自动消除0 如输入012,则显示12 很容易想到在textbox的text changed事件中判断,如果text是 ...

  10. java使用.net的webservice

    1.下载最新的axis2 http://mirrors.hust.edu.cn/apache//axis/axis2/java/core/1.6.3/axis2-1.6.3-bin.zip 2.解压使 ...