project euler 39
2015-12-04 21:20
399 查看
Problem
39
Integer right trianglesIf p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exactly three solutions for p = 120.
{20,48,52}, {24,45,51}, {30,40,50}
For which value of p ≤ 1000, is the number of solutions maximised?
整数边长直角三角形
若三边长{a,b,c}均为整数的直角三角形周长为p,当p = 120时,恰好存在三个不同的解:
{20,48,52}, {24,45,51}, {30,40,50}
在所有的p ≤ 1000中,p取何值时有解的数目最多?
@Test public void test(){ System.out.println(getLargest(1000)); } public int getLargest(int limit){ Map<Integer, Integer> perimeterMap = new HashMap<Integer, Integer>(); for( int i = 12; i <= limit ; i ++){ for( int a = i - 1; a > 1; a -- ){ for( int b = a - 1; b > 0; b --){ int c = i - a - b; if( c < 0){ continue; } if( a * a + b * b == c * c ){ int perimeter = i; if( !perimeterMap.containsKey(perimeter)){ perimeterMap.put(perimeter, 0); } perimeterMap.put(perimeter, perimeterMap.get(perimeter) + 1); } } } } int maxId = 0; int maxVal = 0; for( Entry<Integer, Integer> entry : perimeterMap.entrySet()){ int key = entry.getKey(); int val = entry.getValue(); if( key <= limit && val > maxVal){ maxId = key; maxVal = val; } } System.out.println("maxId=" + maxId + ",maxVal=" + maxVal); return maxVal; } /** * x = 2 * a * b; * y = a * a - b * b; * z = a * a + b * b; * 2 | x; a > b > 0; * * (a % 2 == 0 && b % != 0 ) || ( a % 2 != 0 && b % 2 == 0) * * x + y + z = 2 * a ( a + b ) = 1000 * @return */ public int getLargestId(int limit){ int a = (int)(limit / 2); Map<Integer, Integer> perimeterMap = new HashMap<Integer, Integer>(); for( ; a > 0 ; a --){ for( int b = a - 1; b > 0 ; b = b - 1){ int perimeter = 2 * a * ( a + b); System.out.println(perimeter); if( !perimeterMap.containsKey(perimeter)){ perimeterMap.put(perimeter, 0); } perimeterMap.put(perimeter, perimeterMap.get(perimeter) + 1); } } int maxId = 0; int maxVal = 0; for( Entry<Integer, Integer> entry : perimeterMap.entrySet()){ int key = entry.getKey(); int val = entry.getValue(); if( key <= limit && val > maxVal){ maxId = key; maxVal = val; } } System.out.println("maxId=" + maxId + ",maxVal=" + maxVal); return maxVal; }
相关文章推荐
- if语句实现分支结构 课后习题
- Reverse Bits
- 关于×××重复定义在limcmt.lib中的问题。
- 终端卸载Ubuntu软件
- 2-Fourth Scrum Meeting20151204
- 折腾了一个晚上,终于发表了第一篇学习技术博客,
- HDU 1086 You can Solve a Geometry Problem too
- E-栈--括号匹配
- project euler 38
- 53,类方法
- 数组循环语句练习
- Java [Leetcode 39]Combination Sum
- LibSVM C/C++
- project euler 37
- LibSVM C/C++
- hud 2099
- PHPCMS几个有用的全局函数
- hdu1176
- java获取系统时间比实际时间少了8个小时的解决方法
- NYOJ 119士兵杀敌(三)【RMQ裸题】