Project Euler 39

辺の長さが{a,b,c}と整数の3つ組である直角三角形を考え, その周囲の長さをpとする. p = 120のときには3つの解が存在する:

{20,48,52}, {24,45,51}, {30,40,50}
p < 1000 で解の数が最大になる p を求めよ.

Mathematica

ans = Table[0, {i, 1000}];

For[a = 1, a <= 1000, a++,
 For[b = a, b <= 1000, b++,
  
  c = Sqrt[a^2 + b^2];
  p = a + b + c;
  If[IntegerQ[c] && p < 1000, ans[[p]]++]
  
  ]
 ]
Position[ans, Max[ans]]

ループ回数が 1000×1000/2 はもう少し同値な関係によって減らせるような気もしますが。


C/C++

#include <iostream>
using namespace std;

int main(){
	int c, count;
	int maxp=0, maxcount=0;

	for(int p=1 ; p<= 1000 ; p++){
		count=0;
		for(int a=1 ; a<p ; a++){
			for(int b=a+1 ; b<p ; b++){
				c = p - a - b;
				if(c<=0) break;
				if(c*c == a*a + b*b) count++;
			}
		}
		if(maxcount < count){
			maxcount = count;
			maxp = p;
		}
	}

	cout << "Finish" << endl;
	cout << maxp << endl;
	int end;
	cin >> end;
}

問題を読み間違えていていらない苦労をしてしまった。