project euler 39

Problem 39


Integer right triangles

If 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;
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值