题目链接

原题:

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. 我的总结SVN的使用

    SVN平时在用时,一般要做到早上一次更新,中间每做出一个模块就要提交,就是一次更新,多次提交, SVN在修改公共类,配置文件时一定要注意,如果修改的是配置文件中的东西,这样修改完之后一定要提交, 如果 ...

  2. 万能的SQLHelper帮助类

    /// <summary> /// 数据库帮助类 /// </summary> public class SQLHelper { private static string c ...

  3. vmware虚拟机上网:host-only

    host-only配置 首先主机:vmware1要能共享本地连接这个网络,共享后vmware的ip会自动设置为如图 其次,vmware网络设置如图 最后,虚拟机设置如图 这样,主机与虚拟机之间就能pi ...

  4. Python中的除法

    在C/C++语言对于整形数执行除法会进行地板除(舍去小数部分).例如 int a=15/10; a的结果为1. 同样的在Java中也是如此,所以两个int型的数据相除需要返回一个浮点型数据的时候就需要 ...

  5. android控件之EditText

    EditText继承关系:View-->TextView-->EditTextEditText的属性很多,这里介绍几个:android:hint="请输入数字!"//设 ...

  6. ios应用启动后的自动版本检测方式

    今天意外的发现了appstore居然还提供通过url获取json格式的客户端信息链接: http://itunes.apple.com/lookup?id=$id 通过此地址可以获取应用的icon.介 ...

  7. Android之EditText

    EditText 属性介绍: maxLength:设置最大输入字符数. hint:设置空白提示文字. textColorHint:设置空白提示文字的颜色. enabled:设置是否可编辑(可以获得焦点 ...

  8. Java程序员使用的20几个大数据工具

    最近我问了很多Java开发人员关于最近12个月内他们使用的是什么大数据工具. 这是一个系列,主题为: 语言 web框架 应用服务器 SQL数据访问工具 SQL数据库 大数据 构建工具 云提供商 今天我 ...

  9. Python 安装 httpie

    Python 安装 httpie 前段时间开发RESTful的程序,使用浏览器插件HttpRequester,挺高级,易用的.后来在RESTHeart项目中认识了httpie,感觉高大上.在使用htt ...

  10. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld

    前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...