题目链接

原题:

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. jquery easyui combox实用方法记录

    // combogrid刷新 $(“#cc").combogrid('grid').datagrid('load'); // combogrid设置默认选中哪一行 $('#cc').comb ...

  2. 使用 rem 实现 适配各种屏幕布局

    年数已久!!!技术更新太快,谨慎观看,不过作为了解一下思路还是可以的 在此呢,我只大略的谈一下在研究了px,em,rem,和手淘的做法之后,我所采用的做法及硬性规则: 我就不再过多的将上面三种单位的区 ...

  3. Linux的网卡由eth0变成了eth1,如何修复?

    使用wmware安装了linux,安装成功后,使用的网卡是eth0,没有eth1.但是用过一段时间后,不知道为什么eth0无法使用,系统却自动生成了eth1网卡,这可以使用ifconfig命令看的到. ...

  4. oracle中的记录类型

    单词RECORD有“记录”的意思,因此RECORD也称为“记录类型”,使用该类型的变量可以存储由多个列值组成的一行数据. 在声明记录类型变量之前,首先需要定义记录类型,然后才可以声明记录类型的变量. ...

  5. 通过替换frm文件方式修改表结构

    版本:5.6.16 在自己的虚拟环境中,测试创建一个表,表结构如下:mysql> drop table yoon_temp;Query OK, 0 rows affected (0.09 sec ...

  6. Andorid手机振动器(Vibrator)的使用

    标签: android vibrator 震动器 it 分类: Andorid 获取振动器Vibrator实例: Vibrator  mVibrator = (Vibrator) context.ge ...

  7. Ubuntu下安装eclipse及PyDev插件注意事项

    一.安装eclipse前一定要先安装jdk 1.到http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880 ...

  8. 怎么删除有外键约束的MySQL表中的数据

    SET FOREIGN_KEY_CHECKS = 0 操作结束后 SET FOREIGN_KEY_CHECKS = 1

  9. C#开源大全--汇总

    商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...

  10. win7 telnet命令无法使用

    很多做网络测试的同学发现安装win7后,无法使用telnet命令了,提示“telnet不是内部或外部命令,也不是可运行的程序”,但是很需要在win7中使用telnet工具,怎么办? 首先你要要确认你的 ...