--- id: 5900f3931000cf542c50fea6 title: 问题39:整数直角三角形 challengeType: 5 videoUrl: '' dashedName: problem-39-integer-right-triangles --- # --description-- 如果p是具有整数长度边的直角三角形的周长{a,b,c},则对于p = 120,恰好有三个解。{20,48,52},{24,45,51},{ 30,40,50}对于p≤n的值,最大化解的数量是多少? # --hints-- `intRightTriangles(500)`应该返回420。 ```js assert(intRightTriangles(500) == 420); ``` `intRightTriangles(800)`应该返回420。 ```js assert(intRightTriangles(800) == 720); ``` `intRightTriangles(900)`应该返回840。 ```js assert(intRightTriangles(900) == 840); ``` `intRightTriangles(1000)`应该返回840。 ```js assert(intRightTriangles(1000) == 840); ``` # --seed-- ## --seed-contents-- ```js function intRightTriangles(n) { return n; } intRightTriangles(500); ``` # --solutions-- ```js // Original idea for this solution came from // https://www.xarg.org/puzzle/project-euler/problem-39/ function intRightTriangles(n) { // store the number of triangles with a given perimeter let triangles = {}; // a is the shortest side for (let a = 3; a < n / 3; a++) // o is the opposite side and is at least as long as a for (let o = a; o < n / 2; o++) { let h = Math.sqrt(a * a + o * o); // hypotenuse let p = a + o + h; // perimeter if ((h % 1) === 0 && p <= n) { triangles[p] = (triangles[p] || 0) + 1; } } let max = 0, maxp = null; for (let p in triangles) { if (max < triangles[p]) { max = triangles[p]; maxp = parseInt(p); } } return maxp; } ```