Project Euler 75:Singular integer right triangles
原题:
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的更多相关文章
- Python练习题 039:Project Euler 011:网格中4个数字的最大乘积
本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...
- Python练习题 049:Project Euler 022:姓名分值
本题来自 Project Euler 第22题:https://projecteuler.net/problem=22 ''' Project Euler: Problem 22: Names sco ...
- Python练习题 048:Project Euler 021:10000以内所有亲和数之和
本题来自 Project Euler 第21题:https://projecteuler.net/problem=21 ''' Project Euler: Problem 21: Amicable ...
- Python练习题 047:Project Euler 020:阶乘结果各数字之和
本题来自 Project Euler 第20题:https://projecteuler.net/problem=20 ''' Project Euler: Problem 20: Factorial ...
- Python练习题 046:Project Euler 019:每月1日是星期天
本题来自 Project Euler 第19题:https://projecteuler.net/problem=19 ''' How many Sundays fell on the first o ...
- Python练习题 045:Project Euler 017:数字英文表达的字符数累加
本题来自 Project Euler 第17题:https://projecteuler.net/problem=17 ''' Project Euler 17: Number letter coun ...
- Python练习题 044:Project Euler 016:乘方结果各个数值之和
本题来自 Project Euler 第16题:https://projecteuler.net/problem=16 ''' Project Euler 16: Power digit sum 2* ...
- Python练习题 043:Project Euler 015:方格路径
本题来自 Project Euler 第15题:https://projecteuler.net/problem=15 ''' Project Euler: Problem 15: Lattice p ...
- Python练习题 042:Project Euler 014:最长的考拉兹序列
本题来自 Project Euler 第14题:https://projecteuler.net/problem=14 ''' Project Euler: Problem 14: Longest C ...
随机推荐
- Jexus 高并发请求的优化技巧 笔记
Jexus web server 5.1 每个工作进程的最大并发数固定为1万,最多可以同时开启4个工作进程,因此,每台Jexus V5.1服务器最多可以到支持4万个并发连接.但是,按照linux系统的 ...
- 【转】CSS实现兼容性的渐变背景(gradient)效果
一.有点俗态的开场白 要是两年前,实现“兼容性的渐变效果”这个说法估计不会被提出来的,那个时候,说起渐变背景,想到的多半是IE的渐变滤镜,其他浏览器尚未支持,但是,在对CSS3支持日趋完善的今天,实现 ...
- 身处IT的你对身边人都有哪些影响
前不久,跟外甥一起吃饭:他明年就要中考了,我就想,这马上就到人生的关键路口了,看他自己对将来有什么想法没:就问了句:勇勇,你以后想学习哪些方面的东西或者想从事什么工作呢?他简单的说了句:我要跟你一样学 ...
- Debian7系统安装配置手册
一.安装系统 系统版本:Debian7 参考资料:http://www.myhack58.com/Article/48/66/2013/39802.htm 二.配置源 vi /etc/apt/sour ...
- MVVM模式的一个小例子
使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...
- openerp - asterisk connector(转载)
原文:http://www.akretion.com/open-source-contributions/openerp-asterisk-voip-connector OpenERP - Aster ...
- 自改xss小平台上线
原先一直用xss.hk结果不知怎么被关的,正好手上有代码于是自己搭了一个,网上的类似的xss平台大多一样,原先的xss的chrome插件,不适合 "manifest_version" ...
- kibana去掉丑陋的basic验证框,用自定义验证代替。
最近在改写kibana,碰到了验证登录的问题.问题是这样子的,nginx设置了basic认证,然后客户端访问kibana的时候总是会弹出登录框,输入用户名和密码,现在要改写这个登陆框,用bootstr ...
- SVM入门
前言: 又有很长的一段时间没有更新博客了,距离上次更新已经有两个月的时间了.其中一个很大的原因是,不知道写什么好-_-,最近一段时间看了看关于SVM(Support Vector Machine)的文 ...
- ActiveMQ之MessageListener
消息的消费者接收消息可以采用两种方式: 1.consumer.receive()或 consumer.receive(int timeout); 2.注册一个MessageListener. 采用第一 ...