题目链接

原题:

It turns out that 12 cm is the smallest length of wire that can be bent to form an integer sided right angle triangle in exactly one way, but there are many more examples.

12 cm: (3,4,5)
24 cm: (6,8,10)
30 cm: (5,12,13)
36 cm: (9,12,15)
40 cm: (8,15,17)
48 cm: (12,16,20)

In contrast, some lengths of wire, like 20 cm, cannot be bent to form an integer sided right angle triangle, and other lengths allow more than one solution to be found; for example, using 120 cm it is possible to form exactly three different integer sided right angle triangles.

120 cm: (30,40,50), (20,48,52), (24,45,51)

Given that L is the length of the wire, for how many values of L ≤ 1,500,000 can exactly one integer sided right angle triangle be formed?

翻译:

唯一的整数边直角三角形

只能唯一地弯折成整数边直角三角形的电线最短长度是12厘米;当然,还有很多长度的电线都只能唯一地弯折成整数边直角三角形,例如:

12厘米: (3,4,5)
24厘米: (6,8,10)
30厘米: (5,12,13)
36厘米: (9,12,15)
40厘米: (8,15,17)
48厘米: (12,16,20)

相反地,有些长度的电线,比如20厘米,不可能弯折成任何整数边直角三角形,而另一些长度则有多个解;例如,120厘米的电线可以弯折成三个不同的整数边直角三角形。

120厘米: (30,40,50), (20,48,52), (24,45,51)

记电线长度为L,对于L ≤ 1,500,000,有多少种取值只能唯一地弯折成整数边直角三角形?

翻译来源

解题思路:

先参看维基百科,如下:

对正整数m、n,且m>n

若a 、b、c能构成直角三角形 ,则当且仅当:m和n互质,m-n是奇数

同时a、b、c乘以k的整数倍也能够成直角三角形。

解题方法就很明显的

先考虑m的取值范围

a、b是直角边、c是斜边,极端情况下:a=c=L/2,b=0,则n=0,m2  =L/2,则m = sqrt(L/2)

这样在依靠上面的公式即可

Java程序:

package Level3;

public  class PE075{

    void run(){
int L = 1500000;
int max_m = (int)Math.sqrt(L/2);
int[] triple = new int[L+1];
int a,b,c;
int s;
for(int m=2;m<=max_m;m++){
for(int n=1;n<m;n++){
if(gcd(m,n)==1 && (m+n)%2==1){
a = m*m-n*n;
b = 2*m*n;
c = m*m+n*n;
s = a+b+c;
// if(a*a+b*b==c*c){
while(s<=L){
triple[s]+=1;
s+=a+b+c;
}
// }
}
}
}
int count=0;
for(int i=2;i<=L;i++)
if(triple[i]==1)
count++;
System.out.println(count); } int gcd(int m,int n){
int tmp;
if(m<n){
tmp=m;
m=n;
n=tmp;
}
while(n!=0){
m = m - n;
if(m<n){
tmp = m;
m = n;
n = tmp;
}
}
return m;
} public static void main(String[] args){
long t0 = System.currentTimeMillis();
new PE075().run();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms");
}
}

运行结果:

161667
running time=0s72ms

Python程序:

import math
import time
def gcd(m,n):
if m<n:
tmp = n
n = m
m = tmp
while n:
m = m%n
if m<n:
tmp = n
n = m
m = tmp
return m def PE075():
L = 1500000
count = 0
max_m = int(math.sqrt(L/2))
triple = [0 for i in range(0,L+1)]
for m in range(2,max_m+1):
for n in range(1,m):
if gcd(m,n)==1 and (m+n)%2==1:
a = m*m-n*n
b = 2*m*n
c = m*m+n*n
s = a+b +c
while s<=L:
triple[s] +=1
if triple[s]==1:
count+=1
if triple[s]==2:
count-=1
s+= a+b+c
return count if __name__=='__main__':
t0 = time.time()
print "result={0},running time={1}s".format(PE075(),(time.time()-t0))

运行结果:

result=161667,running time=1.09399986267s

Project Euler 75:Singular integer right triangles的更多相关文章

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

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

  2. Python练习题 049:Project Euler 022:姓名分值

    本题来自 Project Euler 第22题:https://projecteuler.net/problem=22 ''' Project Euler: Problem 22: Names sco ...

  3. Python练习题 048:Project Euler 021:10000以内所有亲和数之和

    本题来自 Project Euler 第21题:https://projecteuler.net/problem=21 ''' Project Euler: Problem 21: Amicable ...

  4. Python练习题 047:Project Euler 020:阶乘结果各数字之和

    本题来自 Project Euler 第20题:https://projecteuler.net/problem=20 ''' Project Euler: Problem 20: Factorial ...

  5. Python练习题 046:Project Euler 019:每月1日是星期天

    本题来自 Project Euler 第19题:https://projecteuler.net/problem=19 ''' How many Sundays fell on the first o ...

  6. Python练习题 045:Project Euler 017:数字英文表达的字符数累加

    本题来自 Project Euler 第17题:https://projecteuler.net/problem=17 ''' Project Euler 17: Number letter coun ...

  7. Python练习题 044:Project Euler 016:乘方结果各个数值之和

    本题来自 Project Euler 第16题:https://projecteuler.net/problem=16 ''' Project Euler 16: Power digit sum 2* ...

  8. Python练习题 043:Project Euler 015:方格路径

    本题来自 Project Euler 第15题:https://projecteuler.net/problem=15 ''' Project Euler: Problem 15: Lattice p ...

  9. Python练习题 042:Project Euler 014:最长的考拉兹序列

    本题来自 Project Euler 第14题:https://projecteuler.net/problem=14 ''' Project Euler: Problem 14: Longest C ...

随机推荐

  1. RAID 0+1

    正如其名字一样RAID 0+1是RAID 0和RAID 1的组合形式,也称为RAID 01. 以四个磁盘组成的RAID 0+1为例,其数据存储方式如图所示:RAID 0+1是存储性能和数据安全兼顾的方 ...

  2. jQuery 遍历用法

    jQuery 遍历 DOM 树 parent() 方法返回被选元素的直接父元素(找爸爸). parents() 方法返回被选元素的所有祖先元素,它一路向上直到文档的根元素 (找长辈). parents ...

  3. Java IO流详尽解析

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  4. php中fopen函数用法详解(打开文件)

    介绍下php中的fopen函数. 1.resource  fopen(string  $filename, string $mode [,bool $use_include_path [, resou ...

  5. Android Error:You must supply a layout_width attribute……

    出现这种情况的可能原因目前本人碰到的有: 1:在xml文件中某个属性名或者属性值写错,请务必仔细检查你有没有写错某个拼写. 2:当你在,比如TextView中,没有声明layout_width,经测试 ...

  6. tomcat6.0 数据库连接池配置问题

    tomcat6.0 数据库连接池配置问题: 连接池配好后,启动tomat后,输入项目系统的登录名和密码,报 Cannot create JDBC driver of class '' for conn ...

  7. windows7 64bit下安装Oracle 11g R2

    Win7 bit64,安装的是64位的客户端.   1.PLSql连接数据库   (1)下载 instantclient-basic-win32-11.2.0.1.0.zip解压到Oracle要目当下 ...

  8. mac os去除去除.DS_Store文件--使用python和go(原创)

    .DS_Store (英文全称 Desktop Services Store)是一种由苹果公司的Mac OS X操作系统所创造的隐藏文件,目的在于存贮文件夹的自定义属性,例如文件们的图标位置或者是背景 ...

  9. jvm 数据区划分学习

    Java virtual machine 运行时数据存储区域划分 2015年1月25日 19:15 Pc  寄存器 Each Java Virtual Machine thread has its o ...

  10. SQL的自增列如何重置

    第一种方法:首先去除该列自增的标识,然后再修改id的值,成功修改后,再加上自增标识:如果不修改自增标识,会报错:“无法更新标识列”. 第二种方法:删除该自增列,而后重建一个自增列.