freeCodeCamp/curriculum/challenges/chinese/10-coding-interview-prep/project-euler/problem-39-integer-right-tr...

82 lines
1.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
id: 5900f3931000cf542c50fea6
title: 问题39整数直角三角形
challengeType: 5
videoUrl: ''
dashedName: problem-39-integer-right-triangles
---
# --description--
如果p是具有整数长度边的直角三角形的周长{abc}则对于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;
}
```